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

标签 regex

我需要一个正则表达式来匹配包含序列“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/

相关文章:

java - 使用单引号作为分割点将字符串分割为子字符串,但不要在引号前面加上反斜杠 (\) 并后跟另一个引号

regex - 如何突出显示没有重复字符串的行?

C# Regex.Match 花括号 - 仅内容? (不包括大括号)

php - 如何使用 php 链接电子邮件地址

regex - 需要正则表达式定界符的指导

regex - 从日期/时间字符串中删除分隔符

php - 如何完全替换 PHP 中的所有特殊字符而不在结果中留下任何 HTML 实体

MySQL - 需要查找其中没有句号的记录

python - 在 Twill 中使用正则表达式

javascript - 如何使用正则表达式仅匹配两个点之间的数字(不包括点)