java - 如何在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”并添加两个“??” 匹配字符之前的字符。有人可以帮助我吗?
解决方案
我认为您需要使用单词边界\b
。试试这个改变的模式:
"\\b[0-9]{1,10}[A-Z]{0,1}\\b"
这打印出来:
305556710S
100596269C
为什么有效:
- 这里的不同之处在于它只检查在一对单词边界内的那些字符序列。在您使用的早期模式中,即使来自单词中间的字符序列也可以用于匹配模式,因为即使
11111...
fromCN1111...
与模式匹配并且它通过了。 - 单词边界也匹配字符串输入的结尾。因此,即使候选词出现在行尾,它也会被拾取。
如果末尾可以出现多个英文字母,则删除最大出现指示符,1
在这种情况下:
"\\b[0-9]{1,10}[A-Z]{0,}\\b"
推荐阅读
- azure-data-explorer - 基于另一个计算列创建计算列
- python - 处理终端上的 Diffstat 输出
- html - 无法将 css 添加到 ejs 主文件
- python - 在 python 中使用 bigquery 结果的简单方法,其中查询仅返回一个结果
- api - OpenApi3:是否可以在不创建类的情况下注释模式?
- amazon-web-services - S3 Presigned POST URL 在 URL 中包含字段
- python - 如何将单个文件中的多个 Excel 工作表连接到一个包含原始工作表名称的额外列的单个文件?
- html - 页面对页面大小变化没有响应
- c++ - 有没有办法在运行时检测堆栈溢出?(c++)
- javascript - 两个 jQuery 块之间的作用域