java regex:用至少一个数字匹配一个又一个的字

时间:2016-08-19 05:22:52

标签: java regex regex-lookarounds

我有两个字符串:

    String s1 = "The demo 505/rj is bad";   
    String s2 = " demo zero 4";

String val="demo"String g = s1s2以及正则表达式:

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 = s1s = 505/rj - 对我来说意味着该模式正常
  • 如果g = s2s = zero - 不好 - 因为字“零”不包含至少一位数字

注意:除了字母数字外,该单词还可以包含特殊字符

如何修改此模式以解决案例1和2的问题?

2 个答案:

答案 0 :(得分:2)

您需要在正则表达式模式中将\D替换为\S,因为\D匹配除数字之外的任何字符(因此,它与空格匹配!),并进一步检查比当前单词之后的非空格块。

Pattern p = Pattern.compile("(?<=" + val +")\\s*\\b(?=\\S*\\d)\\S+\\b");
                                                      ^^^^  

请参阅this Java demo

您还可以通过matcher.group(0)访问整个匹配项,无需使用g / m.start()m.end()获取子字符串。

这是一个增强功能:你可以摆脱外观(它们很昂贵)并使用捕获组:

Pattern p = Pattern.compile(val + "\\s*\\b(?=\\S*\\d)(\\S+)\\b");
                            ^^^                      ^^^^^^
//...
String s = m.group(1);

请参阅this updated demo

答案 1 :(得分:1)

您可以删除lookbehind和lookahead,使用延迟匹配和捕获组来简化此正则表达式:

val + "\\s+(\\S*?\\d+\\S*?)\\s+"