正则表达式匹配包含一个序列的任何单词一次

时间:2019-02-03 12:14:35

标签: regex

我需要一个正则表达式,该正则表达式必须与包含序列“ ab”的任何单词匹配一次。所以应该匹配这些:

  • aaaabaaa
  • ab
  • 憎恶

不是这些:

  • 某事
  • abab
  • bacba

使用当前的正则表达式\w*ab\w*,您将获得第一个列表的全部,而第二个列表的第二个,正如下面的代码片段所示。如何指定仅包含一个'ab'的匹配项?

let text = "aaaabaaa ab abomination something abab bacba";

console.log(text.match(/\w*ab\w*/ig));

我搜索了一会儿却没有找到解决方案,但是如果这是某种重复,请告诉我,我将删除问题。

1 个答案:

答案 0 :(得分:5)

您可以使用以单词边界(\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}等,具体取决于您的需求和正则表达式引擎。