例如,在本文中:
Lorem ipsum dolor坐下来,精神上的精神。 Nunc eu tellus vel nunc pretium lacinia。 Proin sed lorem。 Cras sed ipsum。 Nunc a libero quis risus sollicitudin imperdiet。
我想在'ipsum'之后匹配这个词。
答案 0 :(得分:33)
这听起来像是一个看守的工作,但你应该知道并非所有正则表达式都支持它们。在您的示例中:
(?<=\bipsum\s)(\w+)
这将匹配任何字母字符序列,其后跟“ipsum”作为整个单词后跟空格。它确实不匹配“ipsum”本身,你不必担心重新插入它,例如,替代品。
正如我所说,但有些风格(例如JavaScript)根本不支持lookbehind。许多其他(实际上大多数)只支持“固定宽度”的外观 - 所以你可以使用这个例子而不是任何重复操作符。 (换句话说,(?<=\b\w+\s+)(\w+)
不会工作。)
答案 1 :(得分:4)
其他一些响应者建议使用不依赖于lookbehinds的正则表达式,但我认为需要一个完整的,有效的例子才能明白这一点。我们的想法是以正常方式匹配整个序列(“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));
}
请注意,这会打印“dolor”和“Nunc”。要使用lookbehind版本来做到这一点,你必须做一些像hackish这样的事情:
Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");
这是在Java中,它要求lookbehind具有明显的最大长度。有些口味甚至没有那么大的灵活性,当然,有些口味根本不支持外观。
然而,人们似乎在他们的例子中遇到的最大问题不是外观,而是字边界。 David Kemp和ck似乎都期望\b
匹配'm'后面的空格字符,但它没有;它匹配'm'和空间之间的位置(或边界)。
这是一个常见的错误,我甚至在一些书籍和教程中看到过,但是字边界构造\b
从不匹配任何字符。这是一个零宽度断言,如外观和锚点(^
,$
,\z
等),它匹配的是一个前面有单词字符的位置没有后跟一个,或后跟一个单词字符,而不是一个字符。
答案 2 :(得分:1)
存有\ B(\ W *)
答案 3 :(得分:0)
使用javascript
,您可以使用(?=ipsum.*?(\w+))
这也将是第二次出现(Nunc)
答案 4 :(得分:0)
(?<=\bipsum\s|\bipsum\.\s)(\w+)
/(?<=\bipsum\s|\bipsum\.\s)(\w+)/gm
正向后看 (?<=\bipsum\s|\bipsum\.\s)
断言以下正则表达式匹配
\bipsum\s
\ b在单词边界处声明位置:(^\w|\w$|\W\w|\w\W)
ipsum从字面上匹配字符ipsum(区分大小写)
\ s匹配任何空格字符(等于[\r\n\t\f\v ]
)\bipsum\.\s
\ b在单词边界处声明位置:(^\w|\w$|\W\w|\w\W)
ipsum从字面上匹配字符ipsum(区分大小写)
。匹配字符。从字面上看(区分大小写)
\ s匹配任何空格字符(等于[\r\n\t\f\v ]
)
第一捕获组(\ w +)
\ w +匹配任何单词字符(等于[a-zA-Z0-9_]
)答案 5 :(得分:-1)
存有\ B(。*)\ B'/ P>
编辑: 虽然取决于你的正则表达式实现,这可能是饥饿的,并在ipsum之后找到所有单词