2012-10-09 17 views
5

私の問題のために適切な正規表現を作成しようとしていて、明らかに奇妙な問題に遭遇しました。Java Regexの先読みに時間がかかりすぎる

私の目標は、文字列の両端からカンマを削除するには..です私は私がやろうとしているかを説明しましょう。 E、g、文字列, ,, ,,, , , Hello, my lovely, world, ,, ,はちょうどHello, my lovely, worldになるはずです。

私はこれを達成するために、次の正規表現を用意しています (\w+,*? *?)+(?=(,?\W+$))

これは、正規表現のバリデータで魔法のように動作しますが、私は、Androidデバイス上でそれを実行しようとしているとき、matcher.find()機能を見つけるために、〜の1分間ハング適切な試合...私は仮定 は、問題は、私が使用している肯定先読みであるが、私はちょうど最初からと最後に個別にカンマをトリミングするよりも、任意のより良い解決策を見つけることができませんでした:

output = input.replaceAll("^(,?\\W?)+", ""); //replace commas at the beginning 
output = output.replaceAll("(,?\\W?)+$", ""); //replace commas at the end 

です私は肯定的な先読みで逃している何かがあるn Java正規表現?最初と最後にコンマの間で文字列セクションを取得するにはどうすればよいですか?

答えて

8

一致するグループを使用する場合は、先読みを使用する必要はありません。正規表現^[\s,]*(.+?)[\s,]*$試してみてください:

EDIT:それは離れて、^matches()を使用して他の場所有用である可能性がある場合には、技術的に冗長である行の先頭に一致破るために。 [\s,]*は0個以上の空白文字またはカンマと一致しますが、貪欲に一致します。可能な限り多くの文字を受け入れます。 (.+?)は任意の文字列と一致しますが、末尾の疑問符は可能な限り少数の文字と一致するように指示し(貪欲ではない)、その内容を最初の括弧セットとして「グループ1」に取り込みます。貪欲でない一致は、最終グループに同じゼロ以上のコンマまたは空白([\s,]*)を含めることができます。 ^のように、最後の$は行の末尾に一致します。find()の場合は便利ですが、matches()の場合は冗長です。

スペースのみと一致する必要がある場合は、[\s,][ ,]に置き換えてください。

これは動作するはずです:!

Pattern pattern = Pattern.compile("^[\\s,]*(.+?)[\\s,]*$"); 
Matcher matcher = pattern.matcher(", ,, ,,, , , Hello, my lovely, world, ,, ,"); 
if (!matcher.matches()) 
    return null; 
return matcher.group(1); // "Hello, my lovely, world" 
+0

arghh ...私は一致するグループを欠場する可能性がどのように.. :(どうもありがとう、私は私の正規表現の知識をブラッシュアップしました... –

関連する問題