2017-05-02 18 views
1

这里是我用来提取函数名Java的正则表达式 - 为了解析函数名和参数名称 - 抛出PatternSyntaxException:未关闭的性格

正则表达式

^(\w+(\s+)?){2,}\([^[email protected]#$+%^]*\) 

代码

final static String functionNameRegex = "^(\\w+(\\s+)?){2,}\\([^[email protected]#$+%^]*\\)"; 
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,}\([^[email protected]#$+%^]*\) 
          ^
    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) 

新来的正则表达式,帮助我出去rechanging此正则表达式来识别和组的参数名。

回答

4

您使用Pattern.COMMENTS编译正则表达式,并且您在模式中有#符号。你需要逃避它,否则,它表示评论的开始。

使用

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

Java demo

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

+0

谢谢。这有帮助。请提供有关重新更改此正则表达式以捕获参数名称的输入。 –

+0

@surendhar_s查看http://ideone.com/rujQfw,对不起,我只是不确定你需要什么。 –

相关问题