我需要一个正则表达式来匹配包含序列“ab”一次的任何单词。所以它应该匹配这些:
- aaaabaaa
- ab
- 可憎
而不是这些:
- 某事
- 阿巴
- 巴巴巴
使用我当前的正则表达式 \w*ab\w*
我得到了第一个列表的所有内容,但也得到了第二个列表的第二个列表,如下面的代码片段所示。我如何指定它仅在包含一个“ab”时才匹配?
let text = "aaaabaaa ab abomination something abab bacba";
console.log(text.match(/\w*ab\w*/ig));
我搜索了一段时间,没有找到解决方案,但如果这是某种重复,请告诉我,我将删除该问题。
最佳答案
您可以使用以单词边界 (\b
) 开头的正则表达式,然后使用负向前查找,以避免匹配具有两个不连续 ab
字母序列的单词:
\b(?!\w*ab\w*ab)\w*ab\w*
请参阅regex demo
详细信息
\b
- 字边界(?!\w*ab\w*ab)
- 如果紧邻当前位置的右侧有两次 0+ 单词字符的重复,则匹配失败的负向前瞻和ab
\w*
- 0+ 个单词字符ab
-ab
子字符串\w*
- 0+ 个单词字符。
请注意,在某些情况下,您只需要匹配字母,然后更改 \w
就有意义了(它匹配字母、数字和下划线,并且可能匹配更多内容,如果它是 Unicode 识别)到 [^\W\d_]
、[[:alpha:]]
、[a-zA-Z]
、 \p{L}
等,具体取决于您的需要和正则表达式引擎。
关于正则表达式仅匹配包含序列的任何单词一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54502725/