JAVA正则表达式匹配括号 博客分类: JAVA 正则表达式匹配括号
程序员文章站
2024-02-23 12:58:46
...
JAVA的正则表达式目前还不支持平衡组,要实现匹配括号只有定制深度。
其原理就是不断循环匹配括号里的内容和括号后面的内容(\\([^\\(\\)]*\\)[^\\(\\)]*)*
例子:
//匹配二级括号 String str="(a(b))"; String regex = "\\([^\\(\\)]*(\\([^\\(\\)]*\\)[^\\(\\)]*)*\\)"; //匹配三级括号 String str="(a(b(c)))"; String regex = "\\([^\\(\\)]*(\\([^\\(\\)]*(\\([^\\(\\)]*\\)[^\\(\\)]*)*\\)[^\\(\\)]*)*\\)"; //匹配四级括号 String str="(a(b(c(d))))"; String regex = "\\([^\\(\\)]*(\\([^\\(\\)]*(\\([^\\(\\)]*(\\([^\\(\\)]*\\)[^\\(\\)]*)*\\)[^\\(\\)]*)*\\)[^\\(\\)]*)*\\)"
也可以利用非贪婪模式匹配(注:JAVA默认是贪婪模式)
String subStr = "(a.id(b(c(d(e(f))))))id" String regex= "\\([^\\(\\)]*(\\(.*?\\)[^\\(\\)]*)*\\)\\w+[, ]*";
这里顺便说一下贪婪和非贪婪的匹配原理:
a) 如果是贪婪匹配模式则匹配结果为最长匹配,正则表达式引擎会一直匹配到字符串最后,当匹配为false时,通过回溯的方式,倒退找到倒数第一个匹配位置,返回匹配结果
String str = "(a)(b)(c)(d)(e)"; String regex = "\\(.*\\)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); System.out.println("replace: "+str.replaceAll(regex, "O")); while (matcher.find()) { System.out.println("matcher: " + matcher.group(0)); }
输出:
replace:O
matcher: (a)(b)(c)(d)(e)
b) 如果是非贪婪匹配模式则匹配结果为最短匹配,正则表达式引擎会匹配到符合pattern的末尾位置那个字符,然后再往后走一步,发现匹配为false, 又回溯到找到回退的最近一个匹配为true的位置,返回结果。
String str = "(a)(b)(c)(d)(e)"; String regex = "\\(.*?\\)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); System.out.println("replace: "+str.replaceAll(regex, "O")); while (matcher.find()) { System.out.println("matcher: " + matcher.group(0)); }
输出:
replace: OOOOO
matcher: (a)
matcher: (b)
matcher: (c)
matcher: (d)
matcher: (e)
推荐阅读
-
JAVA正则表达式匹配括号 博客分类: JAVA 正则表达式匹配括号
-
Java使用正则表达式匹配获取链接地址的方法示例
-
Java替换中使用正则表达式实现中间模糊匹配的方法
-
一个完整的混合加密方式在Socket客户机服务器通信应用中的例子 博客分类: java 应用服务器Socket正则表达式SecurityGmail
-
Java使用正则表达式匹配获取链接地址的方法示例
-
JAVA正则表达式验证英文字母、汉字和数字!!! 博客分类: Java Notes
-
JAVA正则表达式验证英文字母、汉字和数字!!! 博客分类: Java Notes
-
Java替换中使用正则表达式实现中间模糊匹配的方法
-
Java 中的正则表达式 博客分类: Java基础笔记 正则表达式JavaUnixF#J2SE
-
Java 中的正则表达式 博客分类: Java基础笔记 正则表达式JavaUnixF#J2SE