3

文字列内の文字のグループに一致する正規表現が必要です。文字列の例を次に示します。

qwwwwwwwwweeeeerrtyyyyyqqqqwEErTTT

一致するはずです

(マッチグループ)「結果」

(1)「ク」

(2)「wwwwwwwwww」

(3)「ええええ」

(4)「ん」

(5)「ト」

(6)「イイイイ」

(7)「qqqq」

(8)「わ」

(9)「ええ」

(10)「か」

(11)「TTT」

いくつかの調査を行った後、これが私が思いつくことができる最高のものです

/(.)(\1*)/g

私が抱えている問題は、\1後方参照を使用する唯一の方法は、最初に文字をキャプチャすることです。キャプチャされていないグループの結果を参照できれば、この問題を解決できますが、調査した結果、それは不可能だと思います。

4

4 に答える 4

4

どう/((.)(\2*))/gですか?そうすれば、グループ全体が一致します(それがあなたが望んでいることであり、それがあなたが見つけた解決策に欠けているものだと思います)。

于 2013-10-30T13:26:20.770 に答える
3

ループで Matcher を使用する必要があるようです:

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
于 2013-10-30T13:26:46.363 に答える
1

@cruncher が前提として言ったことは正しいと仮定すると、「どの文字が繰り返されるべきかを事前に知らずに、繰り返し文字グループをキャッチしたい」とします。

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

上記の RegEx では、特定の順序で文字をハードコーディングすることなく、文字グループの繰り返しをキャプチャできるようにする必要があります。

これ?+は、現在のケースが有効な場合、以前に有効だったバックトラッキング ケースを保存しないことで、RAM スペースを浪費しないようにするための消極的な所有量指定子です。

于 2013-10-30T13:21:10.363 に答える
0

あなたは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);
于 2013-10-30T13:37:09.067 に答える