Java 正则表达式 - 解析函数名称和参数名称 - 抛出 PatternSyntaxException: Unclosed Character
Java Regex - To parse function name and argument name - throws PatternSyntaxException: Unclosed Character
这是我用来提取函数名称的正则表达式
正则表达式
^(\w+(\s+)?){2,}\([^!@#$+%^]*\)
代码
final static String functionNameRegex = "^(\w+(\s+)?){2,}\([^!@#$+%^]*\)";
final static String functionString = "public void render(int screenNo, String infoText){}";
final Pattern fnPattern = Pattern.compile(functionNameRegex, Pattern.CASE_INSENSITIVE | Pattern.COMMENTS);
final Matcher fnMatcher = fnPattern.matcher(functionString);
while (fnMatcher.find()) {
System.out.println("Full match: " + fnMatcher.group(0));
for (int i = 1; i <= fnMatcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + fnMatcher.group(i));
}
}
但是,它抛出 PatternSyntaxException。不确定是什么导致了这里的问题,因为我能够以其他语言获得所需的输出。
痕迹:
Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 30
^(\w+(\s+)?){2,}\([^!@#$+%^]*\)
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.clazz(Pattern.java:2548)
at java.util.regex.Pattern.sequence(Pattern.java:2063)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.<init>(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1054)
at TestRegex.main(TestRegex.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
正则表达式的新手,帮助我重新更改此正则表达式以识别和分组参数名称。
您使用 Pattern.COMMENTS
编译正则表达式,并且您在模式中有一个 #
符号。你需要转义它,否则它表示评论的开始。
使用
final static String functionNameRegex = "^(\w+(\s+)?){2,}\([^!@\#$+%^]*\)";
参见Java demo。
此外,如果您打算匹配 2 个或更多 space 个分隔的单词,请考虑将 (\w+(\s+)?){2,}
更改为 (\w+(?:\s+\w+)+)
(它会工作得更快)(第 1 组仍将保留该值在括号之前)。
这是我用来提取函数名称的正则表达式
正则表达式
^(\w+(\s+)?){2,}\([^!@#$+%^]*\)
代码
final static String functionNameRegex = "^(\w+(\s+)?){2,}\([^!@#$+%^]*\)";
final static String functionString = "public void render(int screenNo, String infoText){}";
final Pattern fnPattern = Pattern.compile(functionNameRegex, Pattern.CASE_INSENSITIVE | Pattern.COMMENTS);
final Matcher fnMatcher = fnPattern.matcher(functionString);
while (fnMatcher.find()) {
System.out.println("Full match: " + fnMatcher.group(0));
for (int i = 1; i <= fnMatcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + fnMatcher.group(i));
}
}
但是,它抛出 PatternSyntaxException。不确定是什么导致了这里的问题,因为我能够以其他语言获得所需的输出。
痕迹:
Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 30
^(\w+(\s+)?){2,}\([^!@#$+%^]*\)
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.clazz(Pattern.java:2548)
at java.util.regex.Pattern.sequence(Pattern.java:2063)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.<init>(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1054)
at TestRegex.main(TestRegex.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
正则表达式的新手,帮助我重新更改此正则表达式以识别和分组参数名称。
您使用 Pattern.COMMENTS
编译正则表达式,并且您在模式中有一个 #
符号。你需要转义它,否则它表示评论的开始。
使用
final static String functionNameRegex = "^(\w+(\s+)?){2,}\([^!@\#$+%^]*\)";
参见Java demo。
此外,如果您打算匹配 2 个或更多 space 个分隔的单词,请考虑将 (\w+(\s+)?){2,}
更改为 (\w+(?:\s+\w+)+)
(它会工作得更快)(第 1 组仍将保留该值在括号之前)。