java正则获取字符串中第一次出现的数字

260 阅读6分钟

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;
    }
}

代码解释

  1. 定义正则表达式\d+ 是一个简单的正则表达式,其中 \d 表示匹配任意一个数字字符(等价于 [0-9]),+ 表示匹配前面的元素(即数字字符)一次或多次。因此,\d+ 可以匹配一个或多个连续的数字。
  2. 编译正则表达式:使用 Pattern.compile(regex) 方法将正则表达式编译成一个 Pattern 对象,这样可以提高匹配的效率。
  3. 创建 Matcher 对象:使用 pattern.matcher(text) 方法创建一个 Matcher 对象,该对象用于在指定的文本中进行匹配操作。
  4. 查找第一次出现的匹配结果:调用 matcher.find() 方法查找文本中第一次出现的匹配结果。如果找到了匹配的数字,该方法返回 true,否则返回 false
  5. 提取匹配到的数字:如果 matcher.find() 返回 true,可以使用 matcher.group() 方法获取匹配到的数字字符串。
  6. 处理未找到匹配结果的情况:如果 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());
    }
}

代码解释

  1. 定义正则表达式和待匹配文本:定义了正则表达式 regEx 和待匹配的文本 text
  2. 编译正则表达式:使用 Pattern.compile(regEx) 方法将正则表达式编译成 Pattern 对象。
  3. 创建 Matcher 对象:使用 pattern.matcher(text) 方法创建 Matcher 对象,用于在文本中进行匹配操作。
  4. 查找匹配结果:通过 matcher.find() 方法在文本中查找匹配的字符,若找到则将其添加到 result 字符串构建器中。
  5. 输出结果:最终将匹配到的所有非数字字符连接起来并输出。

输出结果

运行上述代码,输出结果将是:

匹配出来的值是:今天是第 天,还有 天就结束了。

也就是说,这个正则表达式会把文本中除数字以外的所有字符都匹配出来。如果你想提取文本中的数字,可以将正则表达式改为 [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] 整体的含义是匹配除了数字以外的任意一个字符。

  1. 编译正则表达式

Pattern p = Pattern.compile(regEx);

使用 Pattern.compile() 方法将正则表达式 regEx 编译成一个 Pattern 对象。编译后的 Pattern 对象可以重复使用,提高匹配效率。

  1. 创建 Matcher 对象

Matcher m = p.matcher("图4:是图3的同部放大视图i");

使用 Pattern 对象的 matcher() 方法创建一个 Matcher 对象,该对象用于在指定的字符串 "图4:是图3的同部放大视图i" 中进行匹配操作。

  1. 替换操作
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