2012-04-02 23 views
0

フリーテキスト文書の任意の箇条書きリストに一致させようとしています。箇条書きリストは、単語区切り記号の前に任意の数字または小文字として定義されます。ですから、例えばJavaの正規表現の箇条書きリストの検索

1. item a 
2. item b 

のために私は弾丸を見つけるために、次のコードを使用します。

Pattern p1 = Pattern.compile("\\s[\\d][\\.\\)]\\s"); 

これは、限り箇条書きのリストが一桁の項目で構成されてうまく動作します。しかし、できるだけ早く私は、複数桁の箇条書きリストを試して、それが(例12. item c 13. item d)が動作しません私は、正規表現言語の私の解釈がある

Pattern p1 = Pattern.compile("\\s[\\d]+[\\.\\)]\\s"); 

または

Pattern p1 = Pattern.compile("\\s[\\d]\\+[\\.\\)]\\s"); 

にパターンを変えてみましたこれは、 "。"の前に1桁以上の数字がある場合に一致します。しかし、これは機能しません。

誰かが間違っているのを見ることはできますか?

+0

、あなたが定義することができ 'しかし、これはwork.'ていないのですか? – Thomas

+0

これは、「弾丸リスト」の奇妙な定義です。本当に意味するのは、項目が「弾丸」文字によって導入されるリストです。あなたが探しているものは、文字付きリストまたは番号付きリストの項目です。 – EJP

答えて

1
Pattern p1 = Pattern.compile("\\s[\\d]+[\\.\\)]\\s"); 

(2番目のバージョン)が動作するはずですが、あなたはそれを簡略化することができます。

Pattern p1 = Pattern.compile("\\s\\d+[.)]\\s"); 

しかし、それは数字の前に空白を期待していない(そう、それは文字列の先頭にマッチしません、 例えば)。おそらくword boundaryはここに便利です:

Pattern p1 = Pattern.compile("\\b\\d+[.)]\\s"); 

(FYI:あなたの第三の例では、単一の数字の後にリテラル+に一致するようにしようとしていたことが失敗した理由です。)。

0

数字の前に常に空白がないことが問題だと思います。したがって、式を(Java文字列バージョン)"\\s*\\d+[\\.\\)]\\s"に変更してください。

例:小文字のバージョンについては

10. aaa //no whitespace before 10 here, thus the leading whitespace has to be optional 
11. bbb //here the whitespace should match the new line which counts as whitespace 

:。

"\\s*(?:\\d+|[a-z]+)[\\.\\)]\\s" 

(?:\\d+|[a-z]+)手段「の数字または小文字のいずれかのシーケンスを

注これはということa.部分のみが一致するにもかかわらず、123a.と一致します。行内の箇条書きポイントを許可するには、01を追加します式の先頭に(Java文字列)を追加します。これは、テキストの先頭または改行後に開始する必要があることを意味します。

+0

この例では、 '\ s'は' 10'の前に改行にマッチします。 –

+0

@Timあなたが正しいです、私は例を更新します。 – Thomas

1

より簡単な正規表現(テストしていません):ところで

\\s(\\d+)[.)]\\s