我正在寻找一种匹配正则表达式中输入的确切单词的方法。
不幸的是,边界不起作用,因为搜索词可以有多个单词。
我想出了这个正则表达式(?:^|[\\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兼容)编写
答案 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
答案 2 :(得分:0)
答案 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));