2016-08-01 27 views
1
で働いて、JAVAで例外をスロー

私はその作業のために正規表現PHP

\w+[\(](\?*)\w+[\,](\?*)\w+[\)] 

リンクをある作業PHPの正規表現は、ここで私はPHPでそれを使用することができる午前https://regex101.com/r/tB2pS3/1

提供されています私はJAVAで同じを使用する場合、それは

Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 37 (?<A>\w+\((\?*)\w+(,(\?*)\w+)?\))(,(?&A))* 

iがうまく正規表現とJavaに精通し、しかし、私が得たことは、いくつかを読んだ後、それがおそらくいくつかのサポート問題であるわけではないことを私に例外を与えます正規表現がうまく動作し、PHPで正確な結果が得られるので、インターネット上の関連の質問は、Javaの問題がいくつかのところにあります。

この点については、ヘルプが必要です。

+3

Java正規表現は再帰呼び出しとサブルーチン呼び出しをサポートしていないため、 '(?&A)'は無効です。 Aグループのパターンに置き換えてください。また、Java文字列リテラルで正規表現のメタキャラクタをエスケープするために二重バックスラッシュを使用することを忘れないでください。 [、\\ w + \\(\\?* \\ w +)?\\))、 (?:、\\?* \\ w?)?\\))* "'](https://regex101.com/r/tB2pS3/2)。 –

+0

私は正規表現をurのものに置き換えましたが、例外をスローしているわけではなく、パターンも見つけられません。どのように私はリードを持ってどのように私はそれを解決することができます。時間と労力のためにありがとう。 –

+0

内部のキャプチャグループを削除しましたが、必要ですか?彼らをどこに置いてもかまいません。 –

答えて

4

のJava正規表現は(?&A)がここに無効で、とサブルーチンがを呼び出す再帰をサポートしていません。また、Java文字列リテラルで正規表現のメタキャラクタをエスケープするために二重バックスラッシュを使用することを忘れないでください。

のみwayoutがthis demoを参照し、最後に(?<A>)グループパターンを繰り返すことです。

私はあなたが最初のブロックを定義するときに、ここではブロック構築法を提案し、次にビルドしたいです動的パターン:

String block = "\\w+\\(\\?*\\w+(?:,\\?*\\w+)?\\)"; 
String pat = "(" + block + ")(," + block + ")*"; 
List<String> strs = Arrays.asList("a(b)", "a(?v)", "a(b),c(?c,a)"); 
for (String str : strs) { 
    Matcher m = Pattern.compile(pat).matcher(str); 
    while (m.find()) { 
     System.out.println(m.group(0)); 
    } 
} 

Java demoを参照してください。私は内部のキャプチャグループを削除しました。なぜなら、おそらくあなたはそれらを使用するつもりはないからです。