首页 > 解决方案 > 如何在Java中的常规匹配中匹配字符串中不以英文字母开头的所有数字组合

问题描述

我有一个像这样的字符串

String str = "305556710S  or 100596269C OR CN111111111";

我只想匹配这个字符串中以数字开头或以数字开头并以英文字母结尾的字符,然后在匹配的字符前面加上两个“??” 人物。我写了一个像

    Pattern pattern = Pattern.compile("^[0-9]{1,10}[A-Z]{0,1}", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        int start = matcher.start();
        int end = matcher.end();
        String matchStr = matcher.group();
        System.err.println(matchStr);
    }

但它只能匹配第一个字符“305556710S”。但是如果我修改模式

 Pattern pattern = Pattern.compile("[0-9]{1,10}[A-Z]{0,1}", Pattern.CASE_INSENSITIVE);

它将匹配“305556710S”、“100596269C”、“111111111”。但“111111111”的前缀是英文字符“CN”,这不是我的目标。我只想匹配“305556710S”和“100596269C”并添加两个“??” 匹配字符之前的字符。有人可以帮助我吗?

标签: javaregex

解决方案


我认为您需要使用单词边界\b。试试这个改变的模式:

"\\b[0-9]{1,10}[A-Z]{0,1}\\b"

这打印出来:

305556710S
100596269C

为什么有效:

  1. 这里的不同之处在于它只检查在一对单词边界内的那些字符序列。在您使用的早期模式中,即使来自单词中间的字符序列也可以用于匹配模式,因为即使11111...fromCN1111...与模式匹配并且它通过了。
  2. 单词边界也匹配字符串输入的结尾。因此,即使候选词出现在行尾,它也会被拾取。

如果末尾可以出现多个英文字母,则删除最大出现指示符,1在这种情况下:

"\\b[0-9]{1,10}[A-Z]{0,}\\b"

推荐阅读