【问题标题】:Java Regex - To parse function name and argument name - throws PatternSyntaxException: Unclosed CharacterJava Regex - 解析函数名称和参数名称 - 抛出 PatternSyntaxException: Unclosed Character
【发布时间】:2017-05-02 10:35:51
【问题描述】:

这是我用来提取函数名的正则表达式

正则表达式

^(\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)

正则表达式新手,请协助我重新更改此正则表达式以识别和分组参数名称。

【问题讨论】:

    标签: java regex regex-lookarounds


    【解决方案1】:

    您使用Pattern.COMMENTS 编译正则表达式,并且模式内有一个# 符号。你需要转义它,否则它表示评论的开始。

    使用

    final static String functionNameRegex = "^(\\w+(\\s+)?){2,}\\([^!@\\#$+%^]*\\)";
    

    请参阅Java demo

    此外,如果您计划匹配 2 个或更多空格分隔的单词,请考虑将 (\\w+(\\s+)?){2,} 更改为 (\\w+(?:\\s+\\w+)+)(它的工作速度会更快)(第 1 组仍将保留括号前的值)。

    【讨论】:

    • 谢谢。这有帮助。请提供有关重新更改此正则表达式以捕获参数名称的输入。
    • @surendhar_s 请参阅ideone.com/rujQfw,抱歉,我只是不确定您需要什么。
    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多