【问题标题】:Regex to match/group repeating characters in a string正则表达式匹配/分组字符串中的重复字符
【发布时间】:2013-10-30 13:16:24
【问题描述】:

我需要一个正则表达式来匹配字符串中的字符组。这是一个示例字符串:

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT

应该匹配

(匹配组)“结果”

(1)“q”

(2) “wwwwwwwww”

(3) “eeeee”

(4) “rr”

(5) "t"

(6)“年年”

(7)“qqqq”

(8) "w"

(9) “EE”

(10)“r”

(11)“TTT”

在做了一些研究之后,这是我能想到的最好的方法

/(.)(\1*)/g

我遇到的问题是使用\1 反向引用的唯一方法是首先捕获字符。如果我可以参考非捕获组的结果,我可以解决这个问题,但经过研究我认为这是不可能的。

【问题讨论】:

  • 我认为使用 charAt 的循环解决方案更容易阅读和运行更快。
  • 循环确实会快很多。
  • 如果此正则表达式用于 JavaScript,请删除标签 java 并添加 javascript

标签: java regex expression


【解决方案1】:

/((.)(\2*))/g 怎么样?这样,您就可以将整个组匹配(我假设这就是您想要的,而这正是您找到的解决方案所缺少的)。

【讨论】:

  • 你刚刚打败了我!基本上与我使用的正则表达式相同。
【解决方案2】:

看起来你需要在循环中使用匹配器:

Pattern p = Pattern.compile("((.)\\2*)");
Matcher m = p.matcher("qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT");
while (m.find()) {
    System.out.println(m.group(1));
}

输出:

q
wwwwwwwww
eeeee
rr
t
yyyyy
qqqq
w
EE
r
TTT

【讨论】:

    【解决方案3】:

    假设@cruncher 所说的前提是正确的:“我们想在事先不知道应该重复哪个字母的情况下捕获重复的字母组”然后:

    /((a*?+)|(b*?+)|(c*?+)|(d*?+)|(e*?+)|(f*?+)|(g*?+)|(h*?+))/
    

    上述 RegEx 应该允许捕获重复的字母组,而无需硬编码它们出现的特定顺序。

    ?+ 是一个不情愿的所有格量词,如果当前案例有效,它不会通过不保存以前有效的回溯案例来帮助我们不浪费 RAM 空间。

    【讨论】:

    • 问题在于,正则表达式会随着输入域的大小而增长。仅字母是26 * 2 = 52。实际上比这更糟糕。我刚刚意识到您的正则表达式强制执行特定顺序。
    • 由于| 逻辑OR 运算符,最后一个不会强制执行特定顺序。
    • 不情愿的所有格量词?这对我来说是一个新的!量词可以是不情愿的或所有格的,不能两者兼而有之。在这种情况下,它是您想要的所有格类型(a*+b*+ 等)。
    • 不是\w* greedy、\w*? 不情愿、\w*+ 被动姿势和\w*?+ 不情愿姿势姿势,因为它匹配的每一步都具有姿势,但它不匹配所有重复从第一步开始,它等待以下组完成自己的匹配?
    • 这个\w*?+中的?不代表不情愿吗?还是它代表可能(可能或不可能)意味着\w*+ 等同于\w*?+,因为* 表示零次或多次重复,? 表示可能。
    【解决方案4】:

    由于您确实标记了 java,我将提供一个替代的非正则表达式解决方案(我相信需求是最终产品,而不是您到达那里的方法)。

    String repeat = "";
    char c = '';
    for(int i = 0 ; i < s.length() ; i++) {
        if(s.charAt(i) == c) {
            repeat += c;
        } else {
            if(!repeat.isEmpty()) 
                doSomething(repeat); //add to an array if you want
            c = s.charAt(i);
            repeat = "" + c;
        }
    }
    if(!repeat.isEmpty())
        doSomething(repeat);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多