Java 计算字符串中的字符匹配数(仅限正则表达式)?
所以我最近有一个面试问题,问我确定一根绳子是否平衡。字符串在以下两种情况下是平衡的:Java 计算字符串中的字符匹配数(仅限正则表达式)?,java,regex,Java,Regex,所以我最近有一个面试问题,问我确定一根绳子是否平衡。字符串在以下两种情况下是平衡的: “a”和“c”的出现次数之和为偶数 “b”和“d”的出现次数之和为偶数 因此,给定示例“cccddbba”,这些条件成立。c(3)+出现a(1)是偶数(1+3=4)出现d(2)+出现b(2)是偶数(2+2=4)。字符串只能包含字符“a”、“b”、“c”和“d”。正则表达式应该适用于任何字符串,而不仅仅是这个示例 我的任务只是为此编写正则表达式。我假设在后台,他们计算使用我的正则表达式找到的“a”和“c”的匹配数
cccddbba
”,这些条件成立。c(3)
+出现a(1)
是偶数(1+3=4)
出现d(2)
+出现b(2)
是偶数(2+2=4)
。字符串只能包含字符“a”、“b”、“c”和“d”。正则表达式应该适用于任何字符串,而不仅仅是这个示例
我的任务只是为此编写正则表达式。我假设在后台,他们计算使用我的正则表达式找到的“a”和“c”的匹配数,并将它们相加。“b”和“d”也是如此
我有一段时间没碰正则表达式了,所以我做得很糟糕,只得到了
^([ac])*?[db]*?([ac])*?$
,这显然是不正确的。对每个断言使用单独的look ahead:
^(?=(([^ac]*[ac]){2})*[^ac]*$)(?=(([^bd]*[bd]){2})*[^bd]*$).*$
看
这基本上是有效的,因为
([^ac]*[ac]){2}
匹配[ac]
对。其余部分相对简单。对每个断言使用单独的look ahead:
^(?=(([^ac]*[ac]){2})*[^ac]*$)(?=(([^bd]*[bd]){2})*[^bd]*$).*$
看
这基本上是有效的,因为
([^ac]*[ac]){2}
匹配[ac]
对。其余部分相对简单。使用正向前瞻,可以检查a和c是否出现偶数次,b和d也是如此:
^(?=[^ac]*([ac][^ac]*[ac][^ac]*)*$)(?=[^bd]*([bd][^bd]*[bd][^bd]*)*$).*$
两个前瞻组中的每一个都检查整个字符串是否包含其各自字符的偶数。请注意,每个前瞻都锚定在末尾(
$
),以强制它扫描到字符串的末尾。使用正向前瞻,可以检查a和c是否出现偶数次,b和d也是如此:
^(?=[^ac]*([ac][^ac]*[ac][^ac]*)*$)(?=[^bd]*([bd][^bd]*[bd][^bd]*)*$).*$
两个前瞻组中的每一个都检查整个字符串是否包含其各自字符的偶数。请注意,每个前瞻都定位在末尾(
$
),以强制它扫描到字符串的末尾。这似乎与问题中的示例不匹配。抱歉,我意识到我没有指定允许编辑的字符。@Andy是的,确实如此。请参阅演示的链接。(可能您看到的是一个短期的早期版本,很快就被更正了)。这似乎与问题中的示例不匹配。抱歉,我意识到我没有指定允许编辑的字符。@Andy是的,是的。请参阅演示的链接。(也许你看到了一个短暂的早期版本,很快就被更正了)。如果在采访中有人问我这个问题,我会回答“不,正则表达式不是解决这个问题的好方法”。使用正则表达式将是1。无法阅读2。无法维护未来的增强。事实上,这是一个编码挑战,不是一个实际的面试问题,所以我没有发言权:(。但我完全同意你所说的。如果在面试中问我这个问题,我会回答“不,正则表达式不是解决这个问题的好办法”.使用正则表达式将是1.不可读2.无法维护未来的增强功能。实际上,这是一个编码挑战,不是一个实际的面试问题,所以我没有发言权:(.但我完全同意你所说的。