这是问题所在:
字符串仅由a,b,c,d组成。
如果满足以下条件,则认为该字符串是平衡的:
我必须编写一个正则表达式来检查字符串在Java中是否为平衡字符串。
请帮帮我。
答案 0 :(得分:3)
如果您不使用正则表达式,而是使用Java库,则代码将更容易理解。
将 StringUtils 库与 countMatches()或 countOccurencesOf()方法一起使用。
添加依赖项:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
Java代码:
String customString;
int aCount = StringUtils.countMatches(customString, "a");
int bCount = StringUtils.countMatches(customString, "b");
int abSum = aCount + bCount;
// Check sum is even or odd.
if ( (abSum & 1) == 0 ) { even... } else { odd... }
答案 1 :(得分:2)
第一个条件。 a
和c
的总和是偶数,这意味着您可以匹配ac
,aa
,ca
和cc
对。 / p>
使用正则表达式编写为
([ac]{2})*
由于a
和c
中还有其他字符,因此它变为
(([^ac]*[ac]){2})*[^ac]*
第二个条件也一样
(([^bd]*[ac]){2})*[^bd]*
因为输入字符串应仅包含a,b,c,d
,所以[^ac]
应该是[bd]
,[^bd]
应该是[ac]
。
String cond1 = "(([bd]*[ac]){2})*[bd]*";
String cond2 = "(([ac]*[bd]){2})*[ac]*";
String input = "abcdabcd";
boolean matches = Pattern.matches(cond1, input) && Pattern.matches(cond2, input);
This question向我们展示了如何使用先行方式将这两个条件组合为一个正则表达式:
String regex = "(?=^(([ac]*[bd]){2})*[ac]*$)(([bd]*[ac]){2})*[bd]*";
答案 2 :(得分:1)
这是不使用超前行的解决方案。您可以绘制DFA,然后将其转换为正则表达式:-
String regex = (r'^(([ac]{2}|[bd]{2})|([ac][bd]|[bd][ac])([ac]{2}|[bd]{2})*([ac][bd]|[bd][ac]))*$')