我有两个字符串:
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
- 不好 - 因为字“零”不包含至少一位数字注意:除了字母数字外,该单词还可以包含特殊字符
如何修改此模式以解决案例1和2的问题?
答案 0 :(得分:2)
您需要在正则表达式模式中将\D
替换为\S
,因为\D
匹配除数字之外的任何字符(因此,它与空格匹配!),并进一步检查比当前单词之后的非空格块。
Pattern p = Pattern.compile("(?<=" + val +")\\s*\\b(?=\\S*\\d)\\S+\\b");
^^^^
您还可以通过matcher.group(0)
访问整个匹配项,无需使用g
/ m.start()
从m.end()
获取子字符串。
这是一个增强功能:你可以摆脱外观(它们很昂贵)并使用捕获组:
Pattern p = Pattern.compile(val + "\\s*\\b(?=\\S*\\d)(\\S+)\\b");
^^^ ^^^^^^
//...
String s = m.group(1);
答案 1 :(得分:1)
您可以删除lookbehind和lookahead,使用延迟匹配和捕获组来简化此正则表达式:
val + "\\s+(\\S*?\\d+\\S*?)\\s+"