2016-09-11 30 views
0

特定のタグで囲まれた文字列からすべての部分文字列を抽出します。私は「*」タグにいくつかのサブ文字列を囲む入力文字列を持っている場合たとえば、:Java RegEx:文字列から複数の部分文字列を抽出する

I contain two terms to extract: *first term* and *second term* 

は、私は何を取得したいことは二つのサブ文字列を「第一項」と、「第二項」です。 私は次のコードで試してみました:

List<String> matches = new ArrayList<>(); 
Matcher m = Pattern.compile(".*\\*(.*)\\*.*").matcher(inputString); 
while(m.find()){ 
    matches.add(m.group(1)); 
} 

しかし、これは私に間違った結果が得られます。私はgroupメソッドに関するAPIドキュメントを読んでいますが、正直言って私はそれが何を意味し、どのように機能するのかはよく分かりません。もし誰かが、ここですべての必要なサブストリングを集めることが最善の方法であると教えてくれたら、感謝しています。

ありがとうございます!

+0

'\\ *(。*?)\\ *'を使用します。つまり貪欲ではありません。 – Tunaki

+0

「貪欲」とはどういう意味ですか?ありがとう – user3237736

+0

"欲張り"は、一致を得る方法が複数ある場合、最大の文字数の一致を選択することを意味します。あなたの正規表現が 'a。* b'であり、入力文字列が' a1111b ... a2222b'であれば '。*'に対して可能な最大一致を選ぶので、これは文字列全体と一致します。疑問符「a。*?b」を追加することで、最小の文字数で一致するものを選択するよう指示します。これは 'a1111b'にマッチします。 – ajb

答えて

1

は、次の式を試してみてください。

\\*([^\\*]+)\\* 

必要な部分文字列は、最初のグループになります。

+3

文字クラスの中で '*'をエスケープする必要はありません。 '\\ *([^ *] +)\\ *'または '[*]([^ *] +)[*]'が行います。 – Andreas

+0

すごく、ありがとう!しかし、私はかなり理解していません。私のアプローチとはまさに違いはありますか?それは四角い括弧の使い方だと思われますが、なぜそれが必要なのか分かりません。 – user3237736

+0

大括弧では、アスタリスクが一致するフレーズを終わらせるため、アスタリスクは使用できません。正規表現の詳細については、WikiBooksのこの記事(例:https://en.wikibooks.org/wiki/Regular_Expressions/Perl-Compatible_Regular_Expressions and StackOverflow Documentation:http://stackoverflow.com/documentation/regex/topics)を参照してください。 –

関連する問題