2016-08-01 8 views
1

Ich habe eine funktionierende PHP Regex dieRegex werfen Ausnahme in JAVA, arbeiten in PHP

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

die Verbindung für seine Arbeiten ist hier vorgesehen https://regex101.com/r/tB2pS3/1

ich in der Lage bin es in PHP zu verwenden, wie beabsichtigt aber wenn ich das gleiche in JAVA verwenden, es gibt mir Ausnahme, dass

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

ich gut bin nicht versiert in regex und Java, aber was habe ich, dass es vielleicht einige Support-Problem nach einigem Lesen verwandte Frage im Internet, wie die Regex funktioniert gut und es gibt genaue Ergebnisse in PHP, das Problem ist in JAVA einige wo.

Hilfe ist in dieser Hinsicht erforderlich.

+3

Java regex unterstützt keine Rekursions- und Subroutinenaufrufe, '(? & A)' ist ungültig. Ersetzen Sie sie einfach durch das A-Gruppenmuster. Und vergessen Sie nicht, doppelte Backslashes zu verwenden, um Regex-Metazeichen in Java-String-Literalen zu vermeiden. Siehe ['" (\\ w + \\ (\\? * \\ w + (?:, \\? * \\ w +)? \\)) (, \\ w + \\ (\\? * \ \ W + (?:, \\? * \\ w +)? \\)) * "'] (https://regex101.com/r/tB2pS3/2). –

+0

Ich habe meine Regex durch deine ersetzt, es gibt keine Ausnahme, aber finde die Muster auch nicht. Wie auch immer ich die Führung bekommen habe, lass mich das herausfinden. Danke für deine Zeit und Mühe. –

+0

Ich habe die inneren Fanggruppen entfernt, brauchst du sie? Leg sie einfach dahin, wo sie waren. –

Antwort

4

Java regex nicht unterstützt Rekursion und Unterprogramm nennt, (?&A) hier ungültig ist. Vergessen Sie auch nicht, doppelte Backslashes zu verwenden, um Regex-Metazeichen in Java-String-Literalen zu vermeiden.

Der einzige wayout ist die (?<A>) Gruppenmuster am Ende zu wiederholen, siehe this demo:

ich hier einen Block-Bauweise würde vorschlagen, wenn Sie den Block zuerst definieren, und dann eine bauen dynamisches Muster:

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)); 
    } 
} 

Siehe die Java demo. Ich habe die inneren einfangenden Gruppen entfernt, da du sie wahrscheinlich sowieso nicht benutzen wirst.