代码之家  ›  专栏  ›  技术社区  ›  leonheess

regex与包含序列的任何单词匹配一次

  •  2
  • leonheess  · 技术社区  · 6 年前

    我需要一个正则表达式来匹配任何一个单词,比如说,序列“ab”只包含一次。因此,它应该与以下内容相匹配:

    • AAAABAA
    • 抗体
    • 憎恶

    而不是这些:

    • 某物
    • 阿巴布
    • 巴巴

    用我现在的瑞格 \w*ab\w* 我得到了第一个列表中的所有内容,但也得到了第二个列表中的第二个列表,如您在下面的代码片段中所看到的。我如何指定它只应匹配一个“ab”?

    let text = "aaaabaaa ab abomination something abab bacba",
    
    console.log(text.match(/\w*ab\w*/ig));

    我搜索了一会儿,没有找到解决方案,但如果这是某种类型的副本,请告诉我,我将删除该问题。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Wiktor Stribiżew    6 年前

    可以使用以单词边界开头的regex( \b )然后有一个否定的前瞻性,避免匹配的单词有两个非连续的 ab 字母顺序:

    \b(?!\w*ab\w*ab)\w*ab\w*
    

    regex demo

    细节

    • \b 字边界
    • (?!\w*ab\w*ab) -如果在当前位置的右侧有两个0+字字符和 抗体
    • \w* - 0 +字字符
    • 抗体 -安 抗体 子串
    • \W* -0+字字符。

    请注意,在某些情况下,您只需要匹配字母,然后进行更改是有意义的。 \w (它匹配字母、数字和下划线,如果知道Unicode,则可能会匹配更多)到 [^\W\d_] , [[:alpha:]] , [a-zA-Z] , \p{L} 等等,取决于你需要什么和regex引擎。