【问题标题】:Regex multi word boundry (exact word)正则表达式多词边界(精确词)
【发布时间】:2019-01-30 13:53:27
【问题描述】:

我正在寻找一种方法来匹配在正则表达式中输入的确切单词。

很遗憾,边界不起作用,因为搜索词可以包含多个单词。

我想出了这个正则表达式 (?:^|[\\s])(<word>)(?:$|[\\s!?]),它可以完美运行,直到有多个 <word>s 一个接一个。

示例:

正则表达式: (?:^|[\\s])(won)(?:$|[\\s!?])

文字:

We won won won

在此文本中,它只会匹配每个第二个单词。我明白这是因为需要一个空格,但该空格已包含在前一个单词中。

这有更多的困难。

它不应匹配缩写,例如 won 不应匹配 won't。这也适用于连字符won-me

为了简单起见,我进行了单元测试来测试所有案例:

https://regex101.com/r/9Mj0UC/4/tests

注意:我不能在单元测试中测试它是否匹配每一个或每一个。因此请简单地看一下测试字符串面板。

有人可以为这种疯狂的正则表达式提供解决方案吗?

需要用 Regex 编写(并且兼容 JS)

【问题讨论】:

  • 你有正面/负面例子列表吗?
  • 你想在We won won won中匹配什么?
  • 我想匹配每个won,而不仅仅是We< won >won< won>。因为用我的正则表达式它不会匹配中间那个。

标签: javascript regex


【解决方案1】:

这种方式怎么样(没有后视):

/(?:^|(?!['-])[^]\b)won(?!\B|['-])/i
  1. 行首或除 ' 或 - 之外的任何符号位于单词边界之前。
  2. 这个词。
  3. 否定非字边界或 ' 或 - 的先行断言。 (这个没有捕获空格,所以会捕获重复的单词。)

【讨论】:

  • 据我所知,这很好用。给我多一点时间来测试一下。
  • 或者我们可以简化一下:/(?:^|[^'-]\b)won(?!\B|['-])/i
【解决方案2】:

您可以使用以下表达式:

(\w+-)?won(?![-'])

另外,您需要以编程方式检查第一组是否为空,请参阅a demo on regex101.com

对于支持后视的引擎(Chrome 等),您甚至可以使用

(?<!\w-)won(?![-'])

a demo on regex101.com as well


第一个可以在JS 中完成,如下所示:
let strings = ["I won't win", "won", "I won", "You won", "We won, finally", "Have we won?", "We won!", "We non-won match", "He won-me"];

let rx = /(\w+-)?won(?![-'])/
strings.forEach(function(item) {
    m = rx.exec(item);
    if ((m != null) && (typeof(m[1]) == 'undefined'))
        console.log(item);
});

【讨论】:

  • Javascript 不支持lookbehind。
  • @Toto:嗯,这并不完全正确,参见例如2ality.com/2017/05/regexp-lookbehind-assertions.html 举个例子。从 Chrome 62 (V8) 开始,确实支持lookbehinds。
  • 可以,但不是所有浏览器都可以。
  • @Toto:这正是我写支持lookbehinds(Chrome等)的引擎的原因
  • 浏览器支持率真的很低
【解决方案3】:

只需使用\b 来匹配单词边界:

console.log("We won won won no-won won-with-hyphen".match(/(?&lt;!-)\b(won)\b(?!-)/g))

Regex101.com example

【讨论】:

  • 为什么要在环视中设置单词边界?
  • 你一定漏掉了这一行:"它不应该匹配连字符的单词,比如 won't should not match won't"
  • 这个问题是消极的向后看。大多数浏览器不支持它。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 我认为你的正则表达式匹配在won't中获胜
  • @Thefourthbird 它会匹配,但这不是问题,它可以通过忽略' 来轻松修复,如下所示:(?&lt;!-|')\b(won)\b(?!-|')。真正的问题是向后看和浏览器支持。
【解决方案4】:

对空格使用正向后视和正向前瞻。下面是正则表达式。

//check if there is are white spaces before and after the word

let regex = /(?<=\s)won(?=\s)/g;

console.log("We won won won't won no-won".match(regex));

【讨论】:

  • Javascript 不支持lookbehind。
  • @Toto 添加了代码 sn-p。请检查。 developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
  • @Toto 这是错误的,ES 2018 支持lookbehind,因此它们仅在支持 ECMA2018 标准的浏览器中可用,这意味着只有最新版本的 Chrome 才能处理它们。
  • @IslamElshobokshy:当然可以,但仅适用于 Chrome。
  • @SwaroopDeval:当我运行代码 sn-p 时出现错误:"message": "SyntaxError: invalid regexp group",
猜你喜欢
  • 2011-04-14
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多