欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)