2012-04-10 4 views
0

javaで非常に特定の一連の文字を「検索」しようとしていますが、正規表現が正しく機能していません。正規表現を使用して1つの単語しか見つかりません。

単語(任意の単語)、スペース、前方スラッシュ、別のスペース、次に「M」(大文字または小文字)、次に一連の数字を探したいとします。私は次の行を使用しています:

Elements rating = doc.getElementsMatchingText(Pattern.compile("\\b\\s/\\s[mM][0-9]+")); 

しかし、これは、全体の行(意図したパターンの前後の単語)を見つけることです。これは助けにもなりません:

Elements rating = doc.getElementsMatchingText(Pattern.compile("^\\b\\s/\\s[mM][0-9]+"));  

私は間違っていますか?正規表現について

+0

あなたの提供するパターンから正確に何を得たいですか?キャプチャグループはありません。そのため、結果のMatcherから特定のデータを抽出するのではなく、一部のテキストにパターンがあるかどうかをチェックするだけです。 –

+0

'\ b'ではなく' \ w + 'を試してください。 – jon

+0

ddoouubbllee - eessccaappeedd Javaを投稿しないでください。予想される入力と予想される結果、使用しているパターンを投稿してください。 – tchrist

答えて

-1

、と試してみてください。

* \ [mm]の[1-9] *

私は正規表現をテストするためにhttp://rubular.com/を使用し、ので、あなたの実験を行うことができます。

さようなら

+0

なぜRubyを使ってJavaパターンをテストするのですか? – tchrist

+0

まず、私が見つけた最初の正規表現検査者だったからです:P私は、JavaとRubyの正規表現は、基本レベルでは同じだと思っていました。 – Simone

+0

私の正規表現をjavaに適合させます。* \\ [Mm] [1-9] *。*、それは動作するようですが、行全体を検索します。私は専門家ではないので、私の答えは申し訳ありません – Simone

2

あなたのケースのための正しいパターンが\\b\\w+\\s/\\s[mM][0-9]+です。

ただし、説明する問題は、パターンではなく使用するAPIに関連しています。 getElementsMatchingTextは一致の詳細にアクセスできないため、パターンに一致するテキストの一部を抽出できないことに注意してください。

手動でdocのすべての要素を反復処理し、各要素のテキストにMatcher.find()を適用する、または単にgetElementsMatchingTextによって返される要素のテキストに再び同じパターンでMatcher.find()を適用する必要があります。次に、一致部分をMatcher.group()として抽出することができます。

+1

私はパターンが正しいとは思わない;例えば、 '\ b \ s'はUnicodeの単語文字に続くASCII空白にのみマッチします。 – tchrist

0

あなたの正規表現には瑕疵があります。あなたは現在一致するものを持っていない

1):私は

\w+/[Mm]\d+ 

(あなたはJavaの文字列に入れたときに適切にエスケープすることを忘れないでください)

あなたの正規表現についていくつか提案します"単語(任意の単語)"(!!!)単語を少なくとも1つの単語の文字と一致させるために\ w +を選択しました。 \ w {2,10}のように2〜10文字の単語を入力することができます。たとえば、さらにカスタマイズしたい場合などです。

2)あなたは)\ Wは*の試合が唯一の有効な単語文字

3に一致するすべてであるため、\ bを必要とするだけのスペース以上のものを一致させることが心の\ sの中に保管しない..私はちょうど使用します空白ですが、タブ、改行(そのように設定されている場合)などと一致しても構いませんが、\ sに入れることができます。

4)\ dは[0-9]

+1

これは意味がありません。いわゆる非捕捉群は全く重要ではない。 – tchrist

+0

@tchrist - doh、あなたは\ b式について正しい。問題の式を修正するのではなく、最初からやり直しておくべきだろう。編集します、ありがとう! –

+0

ポイント2については、実際には\ b \ w + \ b'と '\ w +'の微妙な違いがあります:前者は両側の境界を必要とし、後者は境界を必要とし、 '' peek "'のような文字列の内部は、double-eのようになります。前者はできなかった。しかし、Javaのnew-in-Javaの 'UNICODE_CHARACTER_CLASS'や埋め込み'(を使用しない限り、Javaの '\ b'と' \ w'(と '\ s'など)は**互いに完全に壊れています** ?U) 'パターンコンパイルフラグ。 – tchrist

関連する問題