2012-01-25 11 views
1

私は正規表現の学習の最初の数日間です。私は単純なパターンマッチをして、ログファイルに@@@ XXX @@@マーカーを見つけようとしています。ここで、XXXは大文字のスペースで、数値は許可されていません(アンダースコアも許されます)。 & & &と実際の単語または単語との間にはスペースを入れないでください。& & &。 XXXは常に大文字で、そこにスペースや数値は使用できません(アンダースコアは許可されます)。通常の情報パターン

いくつかの許可例: @@@ CAT @@@

@@@ CAT @@@

@@@ CAT @@@

@@@ CAT_DOG @@@

それはの3つのインスタンスをチェックという意味ではありません@

Pattern pattern = Pattern.compile("\\@{3}(\\s* \\w \\s*)\\@{3}"); 

:私のようなものをやってみました

スペースのo個からn個までのインスタンスと、それに続くスペースのo個からn個のインスタンスと、それに続く@? @を使用してケースをキャプチャしますが、3 @を超えるものは使用しません。 @のインスタンスが3つしかないことを3つまで指定するにはどうすればよいですか? ....そして明らかに、私はまだ大文字の制限を入れていません。

+1

例にスペースが含まれています。いくつかのタイプミスがあるかもしれません。確認してください。 – 0605002

答えて

0

これを試してみてください:

"(^|[^@])@{3}\s*[_A-Z]+\s*@{3}($|[^@])" 
+0

閉じるが、 '@'文字と文字/アンダースコアの間に許されるスペースがない。 '\ s *'をそこに追加してください。 – Bernard

+0

@Bernardはい、問題は十分明確ではありません。 – 0605002

+0

これは@@@@ CAT @@@@?をキャプチャしませんか?私は@ – phewataal

1

はこれを試してみてください:

(?:[^@]|^)@{3}(\s*[A-Z_]+\s*)@{3}([email protected]) 

// or with Java escaping 

(?:[^@]|^)@{3}(\\s*[A-Z_]+\\s*)@{3}([email protected]) 

リテラルスペースを置くには、必要な空間を演出してくれます。したがってa babとは異なります。元のパターンでは、\\s+ \wの間にスペースがあります。また、\wは小文字と大文字に似ています。文字クラスを使用すると大文字のみが一致します。


3つ以上(コメントの1つが示唆しているように)を避けたい場合は、少し余分なコードを追加する必要があります。

先頭に@を付けます。これは、@文字以外の文字と一致するか、または文字列^の先頭と一致します。 (?:)は、この試合の部分については気にしません。

(?:[^@]|^) 

最後に次の文字を@にすることはできません。 (?!)は、のパターンがの場合には失敗します。これは、ゼロ幅先読みであるため、キャプチャを終了しません。

([email protected]) 

上部のパターンを更新しました。

これらの新しいパターンはではなく、と一致します。

@@@ CAT_DOG @@@@

@@@@ CAT_DOG @@@ここ

+0

私はいくつかの追加情報を追加し、ニードルを3つ以上の@を除外するように更新しました。 – FakeRainBrigand

+0

前にルビュールについて聞いたことはありませんが、[こちらの記事](http://rubular.com/r/uV4sY0ydma)。 – FakeRainBrigand

+0

ありがとうございます。これは動作しています。このトピックに関する別の質問にピギーバックして申し訳ありません。このパターンを他のマーカーに使用する場合は、@の代わりにマーカーとして '*'を使用します。@を*と置き換えるにはどうすればよいですか? – phewataal

1

は、あなたが何をすべきかです。

[^@][email protected]{3}\s*([A-Z_]*)\s*@{3}[^@] 
  1. [^ @]?マッチ随意@以外の任意の単一の文字(@@@@に一致除外する)

  2. @{3}マッチ正確3 @文字

  3. \s*マッチゼロ個以上の空白文字

  4. [A-Z _] *がゼロに一致しますまたは大文字以上の文字または_文字)。 のようにcapture the contents in a Groupという式をラップする()extract the contents easilyです。

  5. \s*マッチゼロ個以上の空白文字

  6. @{3}一致正確に3 @文字

  7. [^ @]が

@@@@にマッチ除外する) @以外の任意の1文字に一致します

interactive regular expressions pagewith your example worked out)ですこのようなことをする。

+0

私はおそらく正しく説明しませんでした。私は望んでいません:@@@@ CAT @@@@をキャプチャします。表示される結果は@のインスタンスが3つだけでなければなりません。 – phewataal

+0

私の答えは大文字と_文字の間の '@ '記号をキャプチャします。リンク先のrublarワークページを参照してください。 –

+0

私の場合、CATをキャプチャしたいのは、@@@ CAT @@@が入力文字列の場合のみです。 @ cat @@または@@@@ CAT @@@@ – phewataal

関連する問題