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 = 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);
}       

两种可能的情况:

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

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

您需要将正则表达式模式中的 \D 替换为 \S,因为 \D 匹配数字以外的任何字符(因此,它匹配 space !), 并检查比当前单词之后的非白色space块更远的地方。

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

this Java demo

您还可以通过 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);

this updated demo

您可以删除后向和前向,使用惰性匹配和捕获组来简化此正则表达式:

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