5

私は自分の問題に対して適切な正規表現を作成しようとしていますが、どうやら奇妙な問題に遭遇しました。

私がやろうとしていることを説明させてください。

私の目標は、文字列の両端からコンマを削除することです。たとえば、文字列, ,, ,,, , , 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

Java正規表現の前向きな先読みに欠けているものはありますか?最初と最後のコンマの間の文字列セクションを取得するにはどうすればよいですか?

4

1 に答える 1

8

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

EDIT:それを分割する^には、行の先頭に一致します。これは、使用する場合は技術的に冗長ですmatches()が、他の場所で役立つ場合があります。[\s,]*0 個以上の空白文字またはコンマに一致しますが、貪欲に、可能な限り多くの文字を受け入れます。(.+?)任意の文字列に一致しますが、末尾の疑問符は、可能な限り少ない文字に一致するように指示し (貪欲ではない)、最初の括弧のセットを形成するため、内容を「グループ 1」にキャプチャします。非貪欲な一致により、最終グループに同じ 0 個以上のコンマまたは空白 ( [\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"
于 2012-10-09T00:09:53.433 に答える