ソリューション (部分)
次のセクションも確認してください。ここで解決策を読むだけではいけません。
コードを少し変更するだけです。
String test = "xyz_stringIAmLookingFor_zxy";
// Make the capturing group capture the text in between (\w*)
// A capturing group is enclosed in (pattern), denoting the part of the
// pattern whose text you want to get separately from the main match.
// Note that there is also non-capturing group (?:pattern), whose text
// you don't need to capture.
Pattern p = Pattern.compile("_(\\w*)_");
Matcher m = p.matcher(test);
while (m.find()) { // find next match
// The text is in the capturing group numbered 1
// The numbering is by counting the number of opening
// parentheses that makes up a capturing group, until
// the group that you are interested in.
String match = m.group(1);
System.out.println(match);
}
Matcher.group()
、引数なしでは、正規表現パターン全体に一致するテキストが返されます。Matcher.group(int group)
指定されたグループ番号を持つグループをキャプチャすることによって一致したテキストを返します。
Java 7 を使用している場合は、名前付きの capture groupを使用できます。これにより、コードが少し読みやすくなります。キャプチャ グループによって一致した文字列には、 でアクセスできますMatcher.group(String name)
。
String test = "xyz_stringIAmLookingFor_zxy";
// (?<name>pattern) is similar to (pattern), just that you attach
// a name to it
// specialText is not a really good name, please use a more meaningful
// name in your actual code
Pattern p = Pattern.compile("_(?<specialText>\\w*)_");
Matcher m = p.matcher(test);
while (m.find()) { // find next match
// Access the text captured by the named capturing group
// using Matcher.group(String name)
String match = m.group("specialText");
System.out.println(match);
}
パターンの問題
\w
にも一致することに注意してください_
。_
あなたが持っているパターンはあいまいです.文字列に2つ以上ある場合に期待される出力が何であるかわかりません. _
アンダースコアを出力の一部にすることを許可しますか?