【问题标题】:Regex doesnt work, how should it be formulated?正则表达式不起作用,应该如何制定?
【发布时间】:2014-04-24 21:52:20
【问题描述】:

我想知道一个字符串是否只包含除最后一个索引之外的相同字符,它可以是除前导字符之外的任何其他可能的字符。 例如:“FFFFFFFl”匹配模式,但“FlFFFF”不匹配。

如果String只有一个Character,应该输出false。

我有这段代码,但实际上它不起作用:

String dance = "FFFFFl";
Pattern p = Pattern.compile(dance.charAt(0) + "{" + (dance.length()-1) + "}\\w^" + dance.charAt(0));
Matcher m = p.matcher(dance);
System.out.println(m.matches());

即使它应该为真,它也会输出“假”。 非常感谢您的帮助!

【问题讨论】:

  • ^ 表示字符串的开头,但是在字符串开头之前有字符,这不应该工作,因为它没有意义。
  • 只有一个字符的字符串应该是什么结果?

标签: java regex string matcher


【解决方案1】:
Pattern p = Pattern.compile("^(.)\\1*+.$");

匹配:

AF
AAAAAF

不匹配:

AAAA
AFFFF

【讨论】:

  • @Christoph:你能举个例子吗?我将编辑我的答案以提供我对其进行测试的示例。
  • 问题是你拿了不匹配的组
  • @Deduplicator 啊,是的,我用匹配的测试后盲目更改它。固定。
  • @Christoph 简而言之,像*+{min, max} 这样的量词是贪婪的,因此它们会尝试匹配最大可能的子字符串,但如果它们匹配长子字符串,它们会允许回溯所以假设你有正则表达式b*b 和数据bbbbb。起初 b* 将匹配所有 5 个 bs 但由于在正则表达式中有另一个 b 需要匹配 b* 将回溯以仅匹配 4 个冷杉 bs 并让最后一个 b 匹配最后 b 在正则表达式中。
  • @Christoph 使用所有格量词(带有额外 + 的量词,如 *+)回溯是不可能的,因此正则表达式 b*+b 将永远不会匹配 bbbbb,因为所有 bs 都将被消耗(拥有)由b* 所以最后b 在正则表达式中将永远找不到它的匹配项(如上所述回溯是不可能的)使得正则表达式无法找到它的匹配项。这里使用了这个想法,而不是b*,我们使用字符串中的第一个字母。 \\1*+ 将使用与字符串中的第一个字符相同的所有字符,让 . 仅匹配与第一个字符不同的内容(否则它将被 \\1*+ 使用
【解决方案2】:

模式:"^(.)\\1*+.$"

java reference

【讨论】:

    【解决方案3】:

    我刚刚发现以下不起作用:

    if (dance.matches("(.)\\1*(!\\1)"))
    

    其中\\1 是第一组(第一个字符)。

    你的方法:

    dance.charAt(0) + "{" + (dance.length()-1) + "}[^" + dance.charAt(0) + "]"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2018-03-21
      • 2020-07-08
      • 2015-06-19
      相关资源
      最近更新 更多