1

文字列を解析して、末尾と先頭で"stringIAmLookingFor"囲まれた - 部分を取得したいと思います。"\_"私は正規表現を使用してそれを照合し"\_"、見つかった文字列を削除しています。これは機能していますが、この問題に対するよりエレガントなアプローチがあるかどうか疑問に思っていますか?

String test = "xyz_stringIAmLookingFor_zxy";
Pattern p = Pattern.compile("_(\\w)*_");
Matcher m = p.matcher(test);
while (m.find()) { // find next match
    String match = m.group();
    match = match.replaceAll("_", "");
    System.out.println(match);
}
4

6 に答える 6

6

ソリューション (部分)

次のセクションも確認してください。ここで解決策を読むだけではいけません。

コードを少し変更するだけです。

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つ以上ある場合に期待される出力が何であるかわかりません. _アンダースコアを出力の一部にすることを許可しますか?

于 2013-03-20T12:18:31.383 に答える
1

group(1)代わりに使用すると、一致するグループではなく、パターン全体が取得されますgroup()group()

参照:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int)

于 2013-03-20T12:20:03.820 に答える
1

すでに括弧を使用しているので、実際に必要なグループを定義できます。パターンを少し微調整する必要があります。

String test = "xyz_stringIAmLookingFor_zxy";
Pattern p = Pattern.compile("_(\\w*)_");
Matcher m = p.matcher(test);
while (m.find()) { // find next match
    System.out.println(m.group(1));
}
于 2013-03-20T12:21:28.370 に答える
0
"xyz_stringIAmLookingFor_zxy".replaceAll("_(\\w)*_", "$1");

括弧内のすべてをこのグループに置き換えます

于 2013-03-20T12:20:15.160 に答える
0

試す

    String s = "xyz_stringIAmLookingFor_zxy".replaceAll(".*_(\\w*)_.*", "$1");
    System.out.println(s);

出力

stringIAmLookingFor
于 2013-03-20T12:22:25.203 に答える
0

より単純な正規表現で、グループは必要ありません:

"(?<=_)[^_]*"

より厳密にしたい場合:

"(?<=_)[^_]+(?=_)"
于 2013-03-20T12:21:15.017 に答える