2

私はJava(またはその点については他の言語)の正規表現に不慣れで、それらを使用して検索を行いたいと考えています。どうすればいいか分からない難しい部分は、一致する文字列内の何かを置き換えることです。

たとえば、探している行が

Person item6 [can {item thing [wrap]}]

その行を見つける正規表現を書くことはできますが、「もの」という言葉が何であるかを見つけることは(行によって異なる場合があるため)、私の問題です。その単語を別のものに置き換えるか、変数に保存して後で使用することができます。Java の正規表現エンジンを使用してこれを行う簡単な方法はありますか?

4

2 に答える 2

3

はい。それを「キャプチャ グループ」で囲みます。これは、興味深い単語に一致する正規表現の一部を ( ) で囲んだものです。

次に例を示します。

public static void main(String[] args) {

    Pattern pat = Pattern.compile("testing (\\d+) widgets");

    String text = "testing 5 widgets";

    Matcher matcher = pat.matcher(text);

    if (matcher.matches()) {
        System.out.println("Widgets tested : " + matcher.group(1));
    } else {
        System.out.println("No match");
    }

}

Pattern と Matcher は java.util.regex から来ています。String クラスにはいくつかのショートカットがありますが、これらは最も柔軟です

于 2010-06-09T23:49:17.230 に答える
1

問題の仕様はあまり明確ではありませんが、うまくいくかもしれないいくつかのアイデアを次に示します。

ルックアラウンドを使用し、replaceAll/First

次の正規表現\w+は、前に string が"{item "あり、後ろにstring が続く に一致します" ["。ルックアラウンドは、唯一のものと正確に一致させるために使用され\w+ます。メタ文字{[必要に応じてエスケープされます。

String text =
    "Person item6 [can {item thing [wrap]}]\n" +
    "Cat item7 [meow meow {item thang [purr]}]\n" +
    "Dog item8 [maybe perhaps {itemmmm thong [woof]}]" ;

String LOOKAROUND_REGEX = "(?<=\\{item )\\w+(?= \\[)";

System.out.println(
    text.replaceAll(LOOKAROUND_REGEX, "STUFF")
);

これは以下を出力します:

Person item6 [can {item STUFF [wrap]}]
Cat item7 [meow meow {item STUFF [purr]}]
Dog item8 [maybe perhaps {itemmmm thong [woof]}]

参考文献


ルックアラウンドの代わりにキャプチャ グループを使用する

ルックアラウンドは慎重に使用する必要があります。特に Java での後読みは非常に限られています。より一般的に適用される手法は、キャプチャ グループを使用して、興味深い部分以上のものを照合することです。

次の正規表現は、前の同様のパターンに一致しますが、接頭辞と接尾辞\w+も含まれています。さらに、inは無制限に繰り返すことができます (Java の後読みでは一致できないもの)。"{item "" ["mitem

String CAPTURING_REGEX = "(\\{item+ )(\\w+)( \\[)";

System.out.println(
    text.replaceAll(CAPTURING_REGEX, "$1STUFF$3")
);

これは以下を出力します:

Person item6 [can {item STUFF [wrap]}]
Cat item7 [meow meow {item STUFF [purr]}]
Dog item8 [maybe perhaps {itemmmm STUFF [woof]}]

パターンには 3 つのキャプチャ グループがあります。

(\{item+ )(\w+)( \[)
\________/\___/\___/
 group 1    2    3

"STUFF"いくつかの「余分な」部分に一致するため、一致したものを単純に置き換えることはできないことに注意してください。それらを置き換えることには興味がないので、これらの部分をキャプチャして、単に置換文字列に戻します。Java の置換文字列でグループがキャプチャしたものを参照する方法は、$シジルを使用することです。したがって、上記の例では$1andです。$3

参考文献


を使用しMatcherて柔軟性を高める

置換文字列ですべてを実行できるわけではありません。たとえば、Java には、キャプチャされた文字列を大文字にする後処理がありません。Matcherこれらのより一般的な置換シナリオでは、次のようなループを使用できます。

Matcher m = Pattern.compile(CAPTURING_REGEX).matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    System.out.println("Match found");
    for (int i = 0; i <= m.groupCount(); i++) {
        System.out.printf("Group %d captured <%s>%n", i, m.group(i));
    }
    m.appendReplacement(sb,
        String.format("%s%s %<s and more %<SS%s",
            m.group(1), m.group(2), m.group(3)
        )
    );
}
m.appendTail(sb);

System.out.println(sb.toString());

上記のプリント:

Match found
Group 0 captured <{item thing [>
Group 1 captured <{item >
Group 2 captured <thing>
Group 3 captured < [>

Match found
Group 0 captured <{item thang [>
Group 1 captured <{item >
Group 2 captured <thang>
Group 3 captured < [>

Match found
Group 0 captured <{itemmmm thong [>
Group 1 captured <{itemmmm >
Group 2 captured <thong>
Group 3 captured < [>

Person item6 [can {item thing thing and more THINGS [wrap]}]
Cat item7 [meow meow {item thang thang and more THANGS [purr]}]
Dog item8 [maybe perhaps {itemmmm thong thong and more THONGS [woof]}]

参考文献

付属品

于 2010-06-10T08:26:36.390 に答える