如何将第一个字与正则表达式匹配后?
-
23-08-2019 - |
题
例如,在这样的文字:
Lorem存有悲坐阿梅德,consectetur adipiscing ELIT。 NUNC欧盟特力德维尔NUNC的Pretium lacinia。 PROIN SED LOREM。信用评级机构的sed存有。 NUNC一个自由人QUIS risus sollicitudin imperdiet。
我想后 'ipsum的' 到字相匹配。
解决方案
这听起来像lookbehinds一份工作,但你应该知道,并非所有的正则表达式的口味支持他们。在您的示例:
(?<=\bipsum\s)(\w+)
这将匹配的下面“文字”作为一个整体字后跟一个空格字母字符的任何序列。它的不可以匹配“文字”本身,你不需要担心的,例如案件重新插入替代品。
正如我说,虽然,一些香料(JavaScript中,例如)不支持回顾后在所有。许多人(大多数,其实)仅支持“固定宽度” lookbehinds - 所以你可以用这个例子而不是任何的重复操作符。 (换句话说,(?<=\b\w+\s+)(\w+)
不会的工作。)
其他提示
其他的一些响应者建议使用不依赖于lookbehinds一个正则表达式,但我认为是需要一个完整的工作示例传达出点。这个想法是,你以正常的方式在整个序列(“文字”,加上一个字)匹配,然后使用捕获组到您感兴趣的部分隔离开来。例如:
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));
}
请注意,这两个打印“悲”和“Nunc公司”。要做到这一点与回顾后的版本,你就必须做喜欢的事的hackish:
Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");
这是在Java中,这需要回顾后具有明显的最大长度。有些味道甚至没有那么多的灵活性,当然,有些根本就不支持lookbehinds。
然而,最大的问题的人似乎在他们的例子是具有不与lookbehinds,但单词边界。无论大卫坎普和CK似乎期望\b
到下面的“M”空格字符匹配,但它不支持;它的“m”和所述空间之间的位置(或边界)的匹配。
这是一个常见的错误,一个我甚至看到了一些书籍和教程反复,但这个词边界构造,\b
,永远不匹配任何字符。这是一个零宽度断言,像lookarounds和锚(^
,$
,\z
等),以及它相匹配的是,或者由一个字字符之前和后面没有一个,或随后的单词的字符和位置不是由一个之前。
存有\ B(\ W *)
使用javascript
可以使用(?=ipsum.*?(\w+))
这会得到一个第二次出现,以及(Nunc)中
存有\ B(。*)\ B'/ P>
编辑: 虽然取决于您正则表达式的实现,这可能是饿了,找到后存有
所有单词