如何编写匹配行尾或匹配串中间无分号字符串的Java正则表达式
正则表达式调整方案
原正则存在的问题
- 未限制
public到methodName()之间的内容不能出现分号,无法过滤中间带分号的无效行 - 默认模式下
$仅匹配整个文本的结尾,无法按行校验行尾是否存在分号
调整后的实现
正则表达式
调整后的正则为:public\\s+[^;]*?\\bmethodName\\b\\s*\\(\\)[^;]*$
各部分逻辑说明:
public:匹配方法的public修饰符前缀\\s+:匹配修饰符后的一个或多个空白字符[^;]*?:非贪婪匹配任意非分号字符,确保目标匹配内容的中间部分不会出现分号\\bmethodName\\b:精准匹配方法名,避免出现方法名部分匹配的误判\\s*\\(\\):匹配方法名后的空白字符和参数括号[^;]*$:匹配括号后到行尾的所有非分号字符,确保行尾没有分号
完整Java代码
需要在编译正则时开启Pattern.MULTILINE模式,让$可以匹配每一行的行尾:
// 开启多行模式,让$匹配每行的行尾 Pattern pattern = Pattern.compile("public\\s+[^;]*?\\bmethodName\\b\\s*\\(\\)[^;]*$", Pattern.MULTILINE); Matcher methodMatcher = pattern.matcher(classContent); // classContent是读取的Java文件内容 while (methodMatcher.find()) { System.out.println("methodname="+methodMatcher.group()); }
场景验证
- 匹配通过场景:
Someword; public void methodName()、public void methodName(),均可正常提取到public void methodName() - 匹配拦截场景:
Someword; public void; methodName();、public void methodName();,中间或行尾带分号,均不会返回匹配结果
内容的提问来源于stack exchange,提问作者Sanzida
相关产品推荐
相关产品推荐

