【问题标题】:Regex repeated character (\\1 doesn't work) [duplicate]正则表达式重复字符(\\1 不起作用)[重复]
【发布时间】:2016-04-06 12:54:54
【问题描述】:

我目前正在尝试在 Java 中创建一个正则表达式,如果输入字符串中存在任何重复字符,则返回 true,否则返回 false,正则表达式尽可能短(用于代码高尔夫挑战)。我不太擅长正则表达式,但我认为这样可以解决问题:

(.)\\1

其中(.) 是任意字符,\\1 是对在正则表达式第一部分中找到的匹配项的引用。

但是,如果我尝试输入“1223”,它不起作用:

public static void main(String[] a){
     System.out.println(java.util.regex.Pattern.matches("(.)\\1", "1223"));
}

这返回 false,而我期待 true 因为 22

有谁知道如何使用java.util.regex.Pattern.matches 或更短的方式修复正则表达式,因为它是代码高尔夫? ;)

Here is an ideone for the test.

【问题讨论】:

  • .matches 需要完整的字符串匹配,请使用 ".*(.)\\1.*"。或者使用你的Matcher.find()
  • @WiktorStribiżew 啊,那是我的问题!谢谢。如果您愿意,可以将其添加为答案。我知道这与我对.matches..的误解有关。
  • System.out.println(java.util.regex.Pattern.compile("(.)\\1").matcher("1223").find());
  • @WiktorStribiżew 感谢您的回答。
  • @Hackerdarshi 你的评论有什么意义?这是正则表达式的一个具体问题,在这里非常好。

标签: java regex string repeat


【解决方案1】:

matches 消耗整个字符串:首先. 匹配“1”,然后\\1 尝试匹配“1”作为下一个字符,但失败了。

你有两个选择:

  • 使用find,或
  • 将您的正则表达式更改为.*(.)\\1.*

解释:

第二个选项现在有效,因为.* 将首先匹配整个字符串,然后将无法匹配\\1,它逐个字符回溯,直到.* 匹配“1”,然后(.)\\1将匹配“22”,最后的 .* 将匹配字符串的其余部分。

【讨论】:

    【解决方案2】:

    Pattern.matches(regex, sequence) 返回 整个 字符串是否对应于regex,而不是如果存在匹配的子字符串。

    对于你想要做的事情,你可以做以下两件事之一:

    1. 改用正则表达式".*(.)\\1.*"
    2. 使用Matcher 类:

      Matcher m = Pattern.compile(regex).matcher(sequence).find(); 
      int start = m.start();  
      int end = m.end();
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多