【问题标题】:Count number of character matches in a string (Regex only)?计算字符串中匹配的字符数(仅限正则表达式)?
【发布时间】:2016-05-26 06:40:25
【问题描述】:

所以我最近有一个面试问题,要求我确定一根弦是否平衡。一根弦在这两种情况下是平衡的:

  1. “a”和“c”的出现次数之和为偶数。
  2. “b”和“d”出现次数之和为偶数。

因此,给定示例“cccddbba”,这些条件成立。 c (3) 的出现+a (1) 的出现是even (1+3=4)d (2) 的出现+b (2) 的出现是even (2+2=4)。字符串只能包含字符“a”、“b”、“c”和“d”。正则表达式应该适用于任何字符串,而不仅仅是这个例子。

我的任务只是为此编写正则表达式。我假设他们在后台计算使用我的正则表达式找到的“a”和“c”的匹配数并将它们总结起来。 'b' 和 'd' 也是如此。

我有一段时间没有接触正则表达式了,所以我做得很糟糕,只到了^([ac])*?[db]*?([ac])*?$,这显然是不正确的。

【问题讨论】:

  • 如果我在一次采访中被问到这个问题,我实际上会回答“不,正则表达式不是一个好的解决方案”。使用正则表达式将是 1. 不可读 2. 无法维护以供未来增强。
  • 嗯,实际上这是一个编码挑战,而不是一个实际的面试问题,所以我没有发言权:(。但我完全同意你所说的。

标签: java regex


【解决方案1】:

对每个断言使用单独的前瞻:

^(?=(([^ac]*[ac]){2})*[^ac]*$)(?=(([^bd]*[bd]){2})*[^bd]*$).*$

live demo

这主要是因为([^ac]*[ac]){2}) 匹配成对的[ac]。剩下的就比较简单了。

【讨论】:

  • 这似乎与问题中的示例不匹配。
  • 抱歉,我意识到我没有指定允许的字符,已编辑。
  • @Andy 是的,确实如此。请参阅演示链接。 (也许您看到了一个短暂的早期版本,很快就被纠正了)。
【解决方案2】:

使用正向前瞻,您可以检查 a 和 c 是否出现偶数次,b 和 d 也是如此:

^(?=[^ac]*([ac][^ac]*[ac][^ac]*)*$)(?=[^bd]*([bd][^bd]*[bd][^bd]*)*$).*$

两个前瞻组中的每一个都检查整个字符串是否包含偶数个它们各自的字符。请注意,每个前瞻都锚定在末尾 ($),以强制它扫描到字符串的末尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 2015-07-31
    • 2012-08-07
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2019-09-20
    • 2011-08-29
    相关资源
    最近更新 更多