正则表达式多词边界(精确词)

时间:2019-01-30 13:53:28

标签: javascript regex

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

不幸的是,边界不起作用,因为搜索词可以有多个单词。

我想出了这个正则表达式(?:^|[\\s])(<word>)(?:$|[\\s!?]),它可以完美工作,直到有多个<word>彼此之间。

示例:

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

文本:

We won won won

在本文中,它将仅与第二个单词匹配。我明白这是因为需要一个空格,但是上一个单词已经包含了这个空格。

还有更多的困难。

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

为简单起见,我进行了单元测试以测试所有情况:

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

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

有人可以为这种Regex疯狂提供解决方案吗?

它需要用正则表达式(与JS兼容)编写

4 个答案:

答案 0 :(得分:1)

您可以使用以下表达式:

(\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);
});

答案 1 :(得分:1)

什么这种方式(不回顾后):

/(?:^|(?!['-])[^]\b)won(?!\B|['-])/i
  1. 行的开始或任何除外符号'或 - 字边界之前
  2. 字。
  3. 先行断言否定不字边界或'或 - 。 (这其中不捕获空间,以便重复的单词被捕获。)

答案 2 :(得分:0)

只需使用max.poll.interval.ms来匹配单词边界:

\b

Regex101.com example

答案 3 :(得分:0)

对空格使用正向后看和正向先行。下面是正则表达式。

//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));