0

正規表現を改善しようとしています。

私はこの文字列を持っています:

String myString = 
    "stuffIDontWant$KEYWORD$stuffIWant$stuffIWant$KEYWORD$stuffIDontWant";

そして、私が欲しいものだけを差し引くためにこれを作りました:

    String regex = "\\$KEYWORD\\$.+\\$.+\\$KEYWORD\\$";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(myString);

    if(m.find()){
        String result = stuff.substring(m.start(), m.end());
    }

目標は、stuffIWant$stuffIWantそれを文字で取得して分割することです$。そのため、それを改善し、Patter と Matcher を Java ソースにインポートしないようにするために、ルックアラウンドについて読んだので、2 番目のアプローチは次のとおりです。

//Deletes what matches regex
    myString.replaceAll(regex, ""); 
// Does nothing, and i thought it was just the opposite of the above instruction.
    myString.replaceAll("(?! "+regex+")", ""); 

正しい方法は何ですか?私のコンセプトはどこが間違っていますか?

4

1 に答える 1

3

あなたはそこに着いています!ただし、ほとんどの場合はキャプチャ グループを使用します。

\\$KEYWORD\\$(.+)\\$(.+)\\$KEYWORD\\$
             ^  ^   ^  ^

これらの括弧は、それらが囲むもの、つまりcaptureを格納します。最初のセットにはインデックス 1 が付けられ、2 番目のセットにはインデックス 2 が付けられます。これを上記の式で試して、何が起こっているかを確認できます。

if (m.find()) {
    int count = m.groupCount();
    for (int i=0; i<count; i++) {
        System.out.println(m.group(i));
    }
} 

ルックアラウンドでも解決できますが、不要です。

(?<=\\$KEYWORD\\$).+?\\$.+?(?=\\$KEYWORD\\$)
^^^^             ^  ^     ^^^^             ^
于 2012-07-10T18:48:51.097 に答える