28

文字列を分割する必要があります

(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)

の中へ

文字列[0] = (年齢は-25::OR::last_name-is-qa6)

文字列[1] = AND

string[2] = (age-is-20::OR::first_name-contains-test)

非常に多くの正規表現を記述しようとしましたが、期待どおりに動作しません。

次の正規表現を使用すると、Matcher.groupCount() は 2 を返しますが、結果を arraylist に割り当てると要素として null が返されます。

パターン pattern = Pattern.compile("(\\)::)?|(::\\()?");

):: または ::( を使用して分割しようとしました。

正規表現がばかげているように見えることはわかっていますが、初心者なので、これは私が書くことができる最高のものです。

4

5 に答える 5

34

正の先読みと後読みを使用して、最初と最後の括弧を一致させることができます。

String str = "(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)";

for (String s : str.split("(?<=\\))::|::(?=\\()"))
    System.out.println(s);

出力:

(age-is-25::OR::last_name-is-qa6)
AND
(age-is-20::OR::first_name-contains-test)

ただし、注意してください。ある種の再帰言語を解析しているようです。正規表現はこれを行うのが苦手です。高度な構文解析を行っている場合は、他の構文解析方法を検討することをお勧めします。

于 2012-06-11T07:02:29.813 に答える
1

私には、あなたのストレスの大部分は、検索語の特殊文字をエスケープする必要性から来ているように見えます。特殊文字を手動でエスケープするのではなく、Pattern.quote(...)を使用してエスケープすることを強くお勧めします。

于 2012-06-11T06:55:31.837 に答える
1

これはうまくいくはずです

 "(?<=\\))::|::(?=\\()"
于 2012-06-11T07:12:16.067 に答える
-1

これはあなたのために働くはずです。

\)::|::\(
于 2012-06-11T06:51:07.000 に答える
-1
textString.split("\\)::|::\\(") 

動作するはずです。

于 2012-06-11T06:50:23.797 に答える