2011-09-16 8 views
1

私のプロジェクトでregexpが頻繁に使用されています。私はテスト文字列のいくつかの提案が必要になります。JavaでのRegexp Lookaroundの提案が必要です

 
1  string   3.33 
     string 
     1 
     string   -3.33 

私は2番目と3番目の行を一致させる必要があります(私は行の最後に3.33(通貨)を持つ文字列を必要としないことを意味します)。 私は非常に多くのバリエーションを試しました。私が得意なのは、

^[\s]+.+[^(?!(\d+\.\d+))]$ 

です。行2はこの正規表現と一致しますが、行3は一致しません。

注:私は行の先頭または最後を気にしています。したがって、上にマークされたテストラインは完璧な空白を持っています。

私はプログラミング言語としてJavaを使用しています。

+0

を、私はあなたが4つのスペースので、あなたのサンプル入力をインデント場合StackOverflowのは、書式設定を保持していること、それが役立つだろうと思う:あなたは大きなテキスト内の一致する行を検索しようとしている場合、あなたはこのように行うことができますMULTILINEモードを指定する必要があります。それはあなたの質問をより明確にするのに役立ちます。また、http://regexpal.com/やhttp://www.fileformat.info/tool/regex.htm –

+0

のようなサイトで試してみることもできます。私はこれをもう一度試してみてください。サンプルテキストを改善してください。 – renato

+0

私はインデントを入れようとしています。いつか私を許してください。 – sankethm7

答えて

0

行ごとにテキストをテストしましたか?あなたはませ必要性を行うテキストに一致するように\d+\.\d+$

その後は再使用することができます。 match()がfalseを返した場合は、その行を取得します。

それはgrep -vのようです。

はgrepを使用してテストしている場合:

kent$ cat a 
1  string   3.33 
     string 
     1 
     string   -3.33 

kent$ grep -Pv '\d+\.\d+$' a 
     string 
     1 
+0

Kent、実際これは大きなプログラムの一部です。私はあなたが提案したようにそれをすることはできません。しかし、アドバイスをありがとう。 – sankethm7

1
[^(?!(\d+\.\d+))] 

character classです。文字クラスは、大括弧で囲まれた文字セットの中の1文字と正確に一致します。

[^!()+.\d] 

冒頭に^が設定を反転させ、そして\dは、文字クラス外でないと同じように数字に一致しますが、残りの文字は、文字通り一致している:あなたは、これに相当します。つまり、!()+.のいずれかの文字、または数字と一致するように指定しています。

あなたはネガティブな先読みを使用しようとしていたようですが、これは有効なアプローチです。あなたが唯一の行の最後に金額を気にする場合は、あなたがこれを行うことができます:

^(?!.*\d+\.\d+$).*$ 

を先読みは、行の末尾に\d+\.\d+を一致させようとします。成功すると、全体的な試合は失敗します。そうでない場合、.*$は行全体を消費するため、Matcherのgroup()メソッドで取得できます。

これは、一度に1行に正規表現を適用していることを前提としています。

(?m)^(?!.*\d+\.\d+$).*$ 
+0

これはいい考えです。私は確かにそれを試みます。私はあなたの説明が好きです。これを念頭に置いて、今後の使用に備えます。ありがとう、アラン。 – sankethm7

+0

アラン、正規表現は私が探しているものにぴったりです。ネガティブな先読みのために何か良いことを学んだ。ご提案いただきありがとうございます。 – sankethm7

関連する問題