java 正则表达式:用至少一个数字逐个匹配单词
java regex: match word after another with at least one digit
我有两个字符串:
String s1 = "The demo 505/rj is bad";
String s2 = " demo zero 4";
String val="demo"
、String g = s1
或 s2
,以及正则表达式模式:
Pattern p = Pattern.compile("(?<=" + val +")\s*\b(?=\D*\d)\S+\b");
Matcher m = p.matcher(g);
if (m.find()) {
String s = g.substring(m.start(), m.end());
System.out.println(s);
}
两种可能的情况:
- 如果
g = s1
,s = 505/rj
- 对我来说意味着该模式工作正常
- 如果
g = s2
,s = zero
- 不好 - 因为单词 "zero" 不包含至少一个数字
注意:除了字母数字,单词还可以包含特殊字符
如何修改此模式以解决案例 1 和案例 2 的问题?
您需要将正则表达式模式中的 \D
替换为 \S
,因为 \D
匹配数字以外的任何字符(因此,它匹配 space !), 并检查比当前单词之后的非白色space块更远的地方。
Pattern p = Pattern.compile("(?<=" + val +")\s*\b(?=\S*\d)\S+\b");
^^^^
您还可以通过 matcher.group(0)
获取整个匹配项,无需使用 m.start()
/m.end()
.[= 从 g
获取子字符串21=]
这是一个增强功能:您可以摆脱后视(它们很昂贵)并使用捕获组:
Pattern p = Pattern.compile(val + "\s*\b(?=\S*\d)(\S+)\b");
^^^ ^^^^^^
//...
String s = m.group(1);
您可以删除后向和前向,使用惰性匹配和捕获组来简化此正则表达式:
val + "\s+(\S*?\d+\S*?)\s+"
我有两个字符串:
String s1 = "The demo 505/rj is bad";
String s2 = " demo zero 4";
String val="demo"
、String g = s1
或 s2
,以及正则表达式模式:
Pattern p = Pattern.compile("(?<=" + val +")\s*\b(?=\D*\d)\S+\b");
Matcher m = p.matcher(g);
if (m.find()) {
String s = g.substring(m.start(), m.end());
System.out.println(s);
}
两种可能的情况:
- 如果
g = s1
,s = 505/rj
- 对我来说意味着该模式工作正常 - 如果
g = s2
,s = zero
- 不好 - 因为单词 "zero" 不包含至少一个数字
注意:除了字母数字,单词还可以包含特殊字符
如何修改此模式以解决案例 1 和案例 2 的问题?
您需要将正则表达式模式中的 \D
替换为 \S
,因为 \D
匹配数字以外的任何字符(因此,它匹配 space !), 并检查比当前单词之后的非白色space块更远的地方。
Pattern p = Pattern.compile("(?<=" + val +")\s*\b(?=\S*\d)\S+\b");
^^^^
您还可以通过 matcher.group(0)
获取整个匹配项,无需使用 m.start()
/m.end()
.[= 从 g
获取子字符串21=]
这是一个增强功能:您可以摆脱后视(它们很昂贵)并使用捕获组:
Pattern p = Pattern.compile(val + "\s*\b(?=\S*\d)(\S+)\b");
^^^ ^^^^^^
//...
String s = m.group(1);
您可以删除后向和前向,使用惰性匹配和捕获组来简化此正则表达式:
val + "\s+(\S*?\d+\S*?)\s+"