2010-12-29 13 views
0

私はテキスト別の正規表現の問題

<page a>The cat ran#$(*#(%)#over(*@#$the(*#% 

を持っており、スキャナやuseDelimiterメソッドを使用していた場合、どのような正規表現私は抽出することができるようになる。これまでのところ、私が試してみました

<page a> 
The 
cat 
ran 
over 
the 

を:

​​

しかし、角かっこはそのままではありません(明らかに、それは代わりにa-zA-Zに一致します)

+0

また、 '* * 'の代わりに' * *'を使いたいと思うでしょう。 '*'は欲張りです(バーと一気にマッチします。最後の閉じて '>') – Cameron

+0

あなたは "別の正規表現の質問"ではなく、タイトルであなたの質問を要約するより良い仕事をすることができますか?タイトルが質問を要約するとサイトがより有用になると私は思う。 –

答えて

1

問題は区切り記号の1つではなく、トークン認識の1つです。あなたのトークンは以下のとおりです。「エンコーディング

  • <page a>
  • The
  • cat
  • ran
  • over
  • the

区切り文字のセットのどこにでも "<"の文字があると、は返されたトークンにが入りません。あなたは(と私はそれが無効仮定かもしれません実現)<page a>がどこかに、文字列の先頭で発生することがわかっている場合、あなたはこのような何か行うことができます:明らかに

Scanner s = new Scanner(...); 
s.useDelimiter("[^\\w]"); 
// Find an angle bracket token, if one is next. 
String token = s.findInLine("<[^.]*>"); 
if (token != null) 
    // process angle bracket token 
token = s.next(); // get next delimited token 
... 

を私がやったけれども、それは(クイックハック試して)。しかし、あなたは簡単にそれを伸ばすことができたと私は思います。

+0

+1。ところで、 'findInLine'はデリミタ(javadocを参照)を無視しますので、' s.useDelimiter( "..") '部分は冗長です。 – rodion

+0

はい、わかっています。しかし、s.useDelimiter()の部分は、区切り文字を 'not \ w'(すなわち、単語以外の文字)に設定するために必要です。それ以外の場合、デフォルトで区切り文字として空白を使用するため、スキャナは区切り文字をスキップしません。 –

1

両方のオプションを切り替えてみましたか?

s.useDelimiter("^(<.*>$)|[^a-zA-Z]"); 
+0

ええ、何も変わらない。 – BobTurbo

+0

'(<.*> $)'部分は、あなたが入力した行全体にまたがるタグがないので、一致しません。 '$'を削除してみてください。 – Cameron

+0

これはs.useDelimiter( "^(<.*?>)| [^ a-zA-Z]")ですが、代わりにa-zクラスと常に一致するため、まだ動作していません。素敵な答えのために+1 – BobTurbo