正则表达式 - 查找不以特定前缀开头的所有匹配单词

时间:2011-06-10 15:12:09

标签: regex

我如何构造一个正则表达式来查找以字符串结尾但不以字符串开头的所有单词?

e.g。在下面的句子中找到所有以'friend'结尾但不以'girl'开头的单词:

<男朋友女朋友在他们要求成为他们

时获得朋友

粗体中的项目应匹配。 '女朋友'这个词不应该。

4 个答案:

答案 0 :(得分:21)

在我的头顶,你可以尝试:

\b             # word boundary - matches start of word
(?!girl)       # negative lookahead for literal 'girl'
\w*            # zero or more letters, numbers, or underscores
friend         # literal 'friend'
\b             # word boundary - matches end of word

<强>更新

这是另一种非显而易见的方法,它应该适用于正则表达式的任何现代实现:

假设您希望提取出现在多个上下文中的模式,但只想在特定上下文中出现匹配,您可以在首先指定不需要的内容时使用更改,然后捕获您执行的操作

因此,使用您的示例,提取除friend之外的girlfriend中的所有单词或结尾单词,您将使用:

\b               # word boundary
(?:              # start of non-capture group 
  girlfriend     # literal (note 1)
|                # alternation
  (              # start of capture group #1 (note 2)
    \w*          # zero or more word chars [a-zA-Z_]
    friend       # literal 
  )              # end of capture group #1
)                # end of non-capture group
\b

注意:

  1. 这是我们要捕获的内容。
  2. 这就是我们要捕获的内容。
  3. 可以描述为:

    • 代表所有单词
    • 首先,匹配'女朋友'并且不捕获(丢弃)
    • 然后匹配“朋友”中的任何单词并将其结束并将其捕获

    在Javascript中:

    const target = 'A boyfriend and girlfriend gained a friend when they asked to befriend them';
    
    const pattern = /\b(?:girlfriend|(\w*friend))\b/g;
    
    let result = [];
    let arr;
    
    while((arr=pattern.exec(target)) !== null){
      if(arr[1]) {
        result.push(arr[1]);
      }
    }
    
    console.log(result);
    

    ,在运行时,将打印:

    [ 'boyfriend', 'friend', 'befriend' ]
    

答案 1 :(得分:6)

试试这个:

/\b(?!girl)\w*friend\b/ig

答案 2 :(得分:5)

这可能有效:

\w*(?<!girl)friend

您也可以尝试

\w*(?<!girl)friend\w*如果您想匹配befriendedboyfriends等字词。

我不确定?<!是否在所有正则表达式版本中都可用,但这个表达式在Expersso中工作(我相信它是.NET)。

答案 3 :(得分:4)

我改变了Rob Raisch对正则表达式的回答,该正则表达式找到包含特定子字符串的单词,但不包含不同的特定子字符串

\b(?![\w_]*Unwanted[\w_]*)[\w_]*Desired[\w_]*\b

例如\ b(?![\ w _] * mon [\ w _] *)[\ w _] *天 [\ w _] * \ b将在其中找到包含“day”(例如day,tuesday,daywalker)的每个单词,除非它还包含“mon”(例如星期一)

对某人有用。