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

标签 regex

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

例如找出以下句子中所有以“ friend ”结尾但不以“女孩”开头的单词:

“一个 男朋友 和女朋友获得了一个 friend 当他们要求 成为 他们”

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

最佳答案

在我的脑海中,你可以尝试:

\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
笔记:
  • 这就是我们不要想捕捉。
  • 这就是我们 想捕捉。

  • 这可以描述为:
  • 对于所有单词
  • 首先,匹配“女朋友”并且不捕获(丢弃)
  • 然后匹配任何以 'friend' 结尾的单词并捕获它

  • 在 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' ]
    

    关于正则表达式 - 查找所有不以特定前缀开头的匹配词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6308334/

    相关文章:

    regex - 如何在 sed Replace 命令中传递可变行号

    javascript - 用方括号替换所有内容的正则表达式

    java - 如何为正则表达式清理字符串

    javascript - 仅数字的 ng-pattern 将接受像 angularjs 中的 '-' 这样的字符

    php用一个空格替换多个空格

    java - 将标识符与字符串、数字和 _ 进行匹配

    javascript - select2 搜索与任意位置正则表达式中键入的字母匹配

    javascript - 用 javascript 封装大的 Markdown 段落

    javascript - 全面的 RegExp 以删除 JavaScript 注释

    c# - 被正则表达式难住了(积极的前瞻问题?)