Mat*_*lor 18 regex lookbehind word-boundary
例如,在本文中:
Lorem ipsum dolor坐下来,精致的adipistur elit.Nunc eu tellus vel nunc pretium lacinia.Proin sed lorem.Cras sed ipsum.Nunc a libero quis risus sollicitudin imperdiet.
我想在'ipsum'之后匹配这个词.
Ben*_*ank 34
这听起来像是一个外观的工作,但你应该知道并非所有正则表达式都支持它们.在你的例子中:
(?<=\bipsum\s)(\w+)
Run Code Online (Sandbox Code Playgroud)
这将匹配任何字母字符序列,其后跟"ipsum"作为整个单词后跟空格.它与"ipsum"本身不匹配,您不需要担心在例如替换的情况下重新插入它.
正如我所说,但有些风格(例如JavaScript)根本不支持lookbehind.许多其他(实际上大多数)只支持"固定宽度"的外观 - 所以你可以使用这个例子而不是任何重复操作符.(换句话说,(?<=\b\w+\s+)(\w+) 就不会工作.)
其他一些响应者建议使用不依赖于后视的正则表达式,但我认为需要一个完整的、有效的示例来理解这一点。这个想法是您以正常方式匹配整个序列(“ipsum”加上下一个单词),然后使用捕获组来隔离您感兴趣的部分。例如:
String s = "Lorem ipsum dolor sit amet, consectetur " +
"adipiscing elit. Nunc eu tellus vel nunc pretium " +
"lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
"a libero quis risus sollicitudin imperdiet.";
Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
System.out.println(m.group(1));
}
Run Code Online (Sandbox Code Playgroud)
请注意,这会打印“dolor”和“Nunc”。要使用lookbehind版本做到这一点,你必须做一些像hackish的事情:
Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");
Run Code Online (Sandbox Code Playgroud)
那是在 Java 中,它要求后视具有明显的最大长度。有些风格甚至没有那么大的灵活性,当然,有些风格根本不支持后视。
然而,人们在他们的例子中似乎遇到的最大问题不是后视,而是词边界。David Kemp 和 ck 似乎都希望\b匹配“m”后面的空格字符,但事实并非如此;它匹配“m”和空格之间的位置(或边界)。
这是一个常见的错误,我什至在几本书和教程中都看到过重复出现的错误,但是词边界结构\b永远不会匹配任何字符。它是一个零宽度断言,如环视和锚点(^, $, \z, 等),它匹配的是一个位置,它前面是一个单词字符而不是一个字符,或者是一个单词字符而不是一个单词字符一。