【问题标题】:Regex match any word that contains a sequence exactly once正则表达式匹配任何包含一个序列的单词恰好一次
【发布时间】:2019-02-03 12:14:34
【问题描述】:

我需要一个正则表达式,它匹配任何包含序列“ab”的单词,比如说,序列“ab”恰好出现一次。所以它应该匹配这些:

  • 啊啊啊啊
  • ab
  • 可憎

而不是这些:

  • 某事
  • abab
  • 巴克巴

使用我当前的正则表达式\w*ab\w*,我得到了第一个列表的所有内容,以及第二个列表的第二个列表,如下面的 sn-p 所示。我如何指定它只在它包含一个“ab”时才匹配?

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

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

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

【问题讨论】:

标签: regex


【解决方案1】:

您可以使用以单词边界 (\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,则可能匹配更多)更改为 @ 是有​​意义的987654333@、[[:alpha:]][a-zA-Z]\p{L} 等,具体取决于您的需要和正则表达式引擎。

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多