【问题标题】:Regex to match strings containing two of any character but not three正则表达式匹配包含两个任意字符但不是三个的字符串
【发布时间】:2018-12-02 11:56:29
【问题描述】:

我希望 Regex 匹配包含相同字符两次(不一定是连续的)的字符串,但如果该字符出现 3 次或更多次,则不匹配。

例如,给定这两个输入:

abcbde
abcbdb

第一个 abcbde 会匹配,因为它包含 b 两次。但是,abcbdb 包含 3 次 b,因此不会匹配。

我已经创建了这个正则表达式,但是它同时匹配:

(\w).*\1{1}

我也尝试使用 ? 修饰符,但它仍然匹配 abcbdb,我不希望它这样做。

【问题讨论】:

  • 这看起来很棘手。你事先不知道哪个角色应该恰好出现两次,对吧?在那种情况下,ababa 呢?它应该因为b 而匹配,但也不应该因为a 而匹配——它是什么?在任何一种情况下,您都需要一个正则表达式引擎来处理尚未匹配的组的后视;没有多少人能做到这一点。所以我们需要知道你使用的是哪个引擎。但我想对字符串进行排序然后检查是否有相同字符的连续运行会更容易和更干净——这很容易用正则表达式或编程方式完成。
  • 请标记正则表达式风格。

标签: regex regex-negation regex-lookarounds


【解决方案1】:

您需要进行两次检查:第一次检查以确保输入中不存在 3 次字符,第二次检查以查找存在 2 次的字符:

^(?!.*(\w).*\1.*\1).*?(\w).*\2

与使用编程语言构建字符频率数组相比,这非常低效,只需要 1 次通过整个输入。但它有效。

【讨论】:

  • 我可能想多了 :) 很好的解决方案!
  • 感谢蒂姆:P 发生在我们最好的人身上!
  • 这与'xxyyy' 不匹配。问题询问字符串是否包含恰好两次的字符(在我的示例中为'x'),没有其他条件。
猜你喜欢
  • 2018-12-19
  • 2012-05-17
  • 2016-04-21
  • 2016-01-16
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多