1、java正则 匹配一段文字中第一次出现数字的数,并取出来。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FirstNumberMatcher {
public static void main(String[] args) {
String text = "今天是第 12 天,还有 3 天就结束了。";
String firstNumber = findFirstNumber(text);
if (firstNumber != null) {
System.out.println("第一次出现的数字是: " + firstNumber);
} else {
System.out.println("文本中未找到数字。");
}
}
public static String findFirstNumber(String text) {
// 定义匹配数字的正则表达式
String regex = "\\d+";
// 编译正则表达式
Pattern pattern = Pattern.compile(regex);
// 创建 Matcher 对象
Matcher matcher = pattern.matcher(text);
// 查找第一次出现的匹配结果
if (matcher.find()) {
// 返回匹配到的数字
return matcher.group();
}
// 未找到匹配结果,返回 null
return null;
}
}
代码解释
- 定义正则表达式:
\d+是一个简单的正则表达式,其中\d表示匹配任意一个数字字符(等价于[0-9]),+表示匹配前面的元素(即数字字符)一次或多次。因此,\d+可以匹配一个或多个连续的数字。 - 编译正则表达式:使用
Pattern.compile(regex)方法将正则表达式编译成一个Pattern对象,这样可以提高匹配的效率。 - 创建 Matcher 对象:使用
pattern.matcher(text)方法创建一个Matcher对象,该对象用于在指定的文本中进行匹配操作。 - 查找第一次出现的匹配结果:调用
matcher.find()方法查找文本中第一次出现的匹配结果。如果找到了匹配的数字,该方法返回true,否则返回false。 - 提取匹配到的数字:如果
matcher.find()返回true,可以使用matcher.group()方法获取匹配到的数字字符串。 - 处理未找到匹配结果的情况:如果
matcher.find()返回false,表示文本中没有匹配的数字,此时返回null。
复杂度分析
- 时间复杂度:代码的时间复杂度为 (O(n)),其中 n 是文本的长度。在最坏情况下,需要遍历整个文本才能找到匹配的数字。
- 空间复杂度:代码的空间复杂度为 (O(1)),只使用了常数级的额外空间。
2、[^0-9]的作用
正则表达式:"[^0-9]"的作用
String regEx = "[^0-9]"; String text = "今天是第 12 天,还有 3 天就结束了。"; 匹配出来的值是什么?
正则表达式含义
你给出的正则表达式 [^0-9] 是一个字符类的否定形式。其中,[] 表示字符类,用于匹配方括号内指定的任意一个字符;^ 在字符类内部时表示否定,即匹配除了方括号内指定字符之外的任意字符;0-9 表示从数字 0 到数字 9 的所有数字字符。所以,[^0-9] 整体的含义是匹配除了数字以外的任意一个字符。
Java 代码示例及结果分析
以下是使用该正则表达式在 Java 中进行匹配的示例代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String regEx = "[^0-9]";
String text = "今天是第 12 天,还有 3 天就结束了。";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(text);
StringBuilder result = new StringBuilder();
while (matcher.find()) {
result.append(matcher.group());
}
System.out.println("匹配出来的值是:" + result.toString());
}
}
代码解释
- 定义正则表达式和待匹配文本:定义了正则表达式
regEx和待匹配的文本text。 - 编译正则表达式:使用
Pattern.compile(regEx)方法将正则表达式编译成Pattern对象。 - 创建 Matcher 对象:使用
pattern.matcher(text)方法创建Matcher对象,用于在文本中进行匹配操作。 - 查找匹配结果:通过
matcher.find()方法在文本中查找匹配的字符,若找到则将其添加到result字符串构建器中。 - 输出结果:最终将匹配到的所有非数字字符连接起来并输出。
输出结果
运行上述代码,输出结果将是:
匹配出来的值是:今天是第 天,还有 天就结束了。
也就是说,这个正则表达式会把文本中除数字以外的所有字符都匹配出来。如果你想提取文本中的数字,可以将正则表达式改为 [0-9]+ ,它可以匹配一个或多个连续的数字。
Matcher.replaceAll(" ")的作用
String regEx = "[^0-9]";//匹配指定范围内的数字 //Pattern是一个正则表达式经编译后的表现模式 Pattern p = Pattern.compile(regEx); // 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 Matcher m = p.matcher("图4:是图3的同部放大视图i"); String o11 = m.replaceAll(" ").trim().replaceAll(" ", ""); 执行结果 o11是啥? m.replaceAll(" ").trim().replaceAll(" ", "");表示啥意思?
执行结果
执行代码后,o11 的值为 43。下面为你详细分析代码的执行过程。
代码逐行分析
1. 定义正则表达式
String regEx = "[^0-9]";
这里定义的正则表达式 [^0-9] 是一个字符类的否定形式。[] 表示字符类,用于匹配方括号内指定的任意一个字符;^ 在字符类内部时表示否定,即匹配除了方括号内指定字符之外的任意字符;0 - 9 表示从数字 0 到数字 9 的所有数字字符。所以,[^0-9] 整体的含义是匹配除了数字以外的任意一个字符。
- 编译正则表达式
Pattern p = Pattern.compile(regEx);
使用 Pattern.compile() 方法将正则表达式 regEx 编译成一个 Pattern 对象。编译后的 Pattern 对象可以重复使用,提高匹配效率。
- 创建
Matcher对象
Matcher m = p.matcher("图4:是图3的同部放大视图i");
使用 Pattern 对象的 matcher() 方法创建一个 Matcher 对象,该对象用于在指定的字符串 "图4:是图3的同部放大视图i" 中进行匹配操作。
- 替换操作
String o11 = m.replaceAll(" ").trim().replaceAll(" ", "");
这行代码包含了三个操作,下面逐一解释:
m.replaceAll(" "):Matcher对象的replaceAll()方法会将字符串中所有匹配正则表达式的部分替换为指定的字符串。这里将匹配到的非数字字符都替换为一个空格。所以,字符串"图4:是图3的同部放大视图i"经过这一步操作后变为" 4 3 "。.trim():trim()方法用于去除字符串首尾的空格。经过这一步,字符串" 4 3 "变为"4 3"。.replaceAll(" ", ""):再次使用replaceAll()方法,将字符串中所有的空格替换为空字符串。最终,字符串"4 3"变为"43"。
总结
综上所述,代码 m.replaceAll(" ").trim().replaceAll(" ", ""); 的作用是将字符串中除数字以外的所有字符都去除,只保留数字字符,并将它们连接成一个连续的字符串。所以,最终 o11 的值为 43。