【问题标题】:Balanced string regular exression平衡字符串正则表达式
【发布时间】:2019-01-17 22:34:25
【问题描述】:

所以问题来了:
字符串仅由 a、b、c、d 组成。

如果满足以下条件,则称该字符串是平衡的:

  1. a和c出现的和是偶数
  2. b和d的出现之和是偶数

我必须写一个正则表达式来检查字符串是否是java中的平衡字符串。
请帮帮我。

【问题讨论】:

  • 这几乎可以肯定是一个家庭作业问题,没有表现出任何努力,但除此之外,正则表达式本身可能无法回答这个问题。您可能需要编写某种解析器。
  • 您最好根据字符数组和文字实例计数来考虑这一点。您可以对汇总结果执行偶数/奇数逻辑。在这种情况下忘记正则表达式。
  • @TimBiegeleisen:理论上的正则表达式(没有环视和东西)是可能的,因为它对应于 4 个状态的 DFA,尽管我不认为它是一个可以写在头顶上的正则表达式.
  • @nhahtdh 如果下面的答案是对问题的正确解释,那么 OP 甚至不需要使用正则表达式。
  • 写一个 DFA 来做这件事(这很容易)然后按照this description 将它转换成一个常规的 espression。

标签: java regex string expression balance


【解决方案1】:

这是一个不使用前瞻的解决方案。您可以绘制 DFA,然后将其转换为正则表达式:-

String regex = (r'^(([ac]{2}|[bd]{2})|([ac][bd]|[bd][ac])([ac]{2}|[bd]{2})*([ac][bd]|[bd][ac]))*$')

【讨论】:

    【解决方案2】:

    对于第一个条件。 ac 之和是偶数,这意味着您可以匹配 acaacacc 对。

    使用正则表达式写成

    ([ac]{2})*
    

    由于ac中还有其他字符,所以变成了

    (([^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]*";
    

    【讨论】:

    • 您可以将两个正则表达式部分合并为一个,方法是将它们转换为任何匹配的前瞻:(?=^(([ac]*[bd]){2})*[ac]*$)(?=^(([bd]*[ac]){2})*[bd]*$).*。请注意,我必须添加^$。详情请见this question
    • 谢谢大家,你们都非常有帮助。
    【解决方案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... }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 2016-12-07
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多