如何匹配表达式后的第一个单词与正则表达式?

时间:2009-02-13 14:52:17

标签: regex lookbehind word-boundary

例如,在本文中:

  

Lorem ipsum dolor坐下来,精神上的精神。 Nunc eu tellus vel nunc pretium lacinia。 Proin sed lorem。 Cras sed ipsum。 Nunc a libero quis risus sollicitudin imperdiet。

我想在'ipsum'之后匹配这个词。

6 个答案:

答案 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) 断言以下正则表达式匹配

  1. 第一种选择 \bipsum\s \ b在单词边界处声明位置:(^\w|\w$|\W\w|\w\W) ipsum从字面上匹配字符ipsum(区分大小写) \ s匹配任何空格字符(等于[\r\n\t\f\v ]
  2. 第二种选择 \bipsum\.\s \ b在单词边界处声明位置:(^\w|\w$|\W\w|\w\W) ipsum从字面上匹配字符ipsum(区分大小写) 。匹配字符。从字面上看(区分大小写) \ s匹配任何空格字符(等于[\r\n\t\f\v ]) 第一捕获组(\ w +) \ w +匹配任何单词字符(等于[a-zA-Z0-9_]
  • 数量词-匹配一次和无限次,次数尽可能多,并根据需要返回(贪婪) 全局模式标志 g修饰符:全局。所有比赛(第一次比赛后不返回) m修饰符:多行。导致^和$匹配每行的开始/结束(不仅是字符串的开始/结束)

答案 5 :(得分:-1)

存有\ B(。*)\ B'/ P>

编辑: 虽然取决于你的正则表达式实现,这可能是饥饿的,并在ipsum之后找到所有单词