【问题标题】:Make Java regex '[abc]+' match once per letter使 Java regex '[abc]+' 每个字母匹配一次
【发布时间】:2016-11-21 19:58:05
【问题描述】:
String[] words = {"a","ab","ac","abc","aac","aa"};
for(String str:words)   {
    if(str.matches("[abc]+"))  {
        System.out.println(str);
    }
}

这段代码打印出来

a,ab,ac,abc,aac,aa

这几乎是我想要的,除了我不希望一个字母被匹配两次。我想更改正则表达式 [abc]+ 以便匹配只会发生一次。 aacaa 不应打印,因为 aa 匹配了两次。 我可以这样做吗?

【问题讨论】:

  • 你在现实生活场景中只有 3 个单字符吗?如果是,并且上面的示例是真正需要的一个非常简化的示例,那么正则表达式不是此任务的最佳工具。
  • 除非人为要求使用正则表达式,否则我会说你最好通过创建一个迭代字符串中的字符并将它们放入 @ 987654328@,如果检测到重复则失败(如果Set.add 返回 false)。
  • 我认为您的问题类似于:stackoverflow.com/questions/12870489/…
  • “aca”呢?
  • 不是所有可以用正则表达式完成的事情。

标签: java regex


【解决方案1】:

使用负前瞻,您可以使用此正则表达式:

^(?:([abc])(?!.*\1))+$

RegEx Demo

如果您想允许任何字符,而不仅仅是[abc],请使用:

^(?:(.)(?!.*\1))+$
  • (.) 匹配和分组任何字符
  • (?!.*\1) 是否定的前瞻,它断言对于捕获的每个字符,当前位置之前不存在相同的字符。
  • (?:...)+ 将匹配字符和前瞻分组到一个非捕获组中,该组重复 1 次或多次以匹配整个字符串。

【讨论】:

    【解决方案2】:

    如果你真的想要一个正则表达式并且你只被允许使用 [abc],那么检查所有可能性非常容易:D。

    String[] words = { "a", "ab", "ac", "abc", "aac", "aa" };
    for (String str : words) {
        if (str.matches("(abc|ab|acb|ac|a|bac|ba|bca|bc|b|cab|ca|cba|cb|c)")) {
            System.out.println(str);
        }
    }
    

    否则,您可以检查字符串是否匹配 [abc]+ 但不包含 "([a-c]).*\\1"

    【讨论】:

      【解决方案3】:

      ab?c? 是你要找的吗?

      【讨论】:

      • 不,字母可能没有排序。 bca 应该匹配。
      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      相关资源
      最近更新 更多