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正则表达式匹配括号相关推荐

  1. JAVA正则校验加减乘除,正则表达式匹配加减法算法

    搜索热词 通过键盘输入100以内正整数的加.减运算式,请编写一个程序输出运算结果字符串. 输入字符串的格式为:"操作数1 运算符 操作数2","操作数"与&qu ...

  2. java 正则 实例_Java正则表达式实例详解

    创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...

  3. java 正则 排除_Java正则表达式:排除单词/字符串

    如果要在搜索模式中排除某个单词/字符串,那么执行此操作的一种好方法是正则表达式断言函数.如果您要匹配不跟随其他东西的东西,这是必不可少的. 一个简单的例子 String str = "pro ...

  4. java正则 转义_java – 正则表达式和转义和未转义的分隔符

    你可以使用正则表达式 (?:\\.|[^;\\]++)* 匹配未转义分号之间的所有文本: List matchList = new ArrayList(); try { Pattern regex = ...

  5. java 数字匹配_java正则表达式匹配数字怎么实现?

    正则表达式中如何匹配当中数字?这是正则表达式经典例题之一,下面小编就带你一起看看它的实现.// 去除可能带有的数字 private static void test6() { // 提取张三 去除数字 ...

  6. java 正则 大括号_java正则表达式获取大括号之间的内容

    "; String reg2 = " "; System.out.println(test.replaceAll(reg, "###")); Syst ...

  7. java正则 链接_Java正则表达式获取网址和链接文字解析

    很久不写正则表达式了,网上看到个面试题关于提取, 各种乱七八糟的解法. 正确的,应该是这样吧: import java.util.regex.Matcher; import java.util.reg ...

  8. java正则转义_Java 正则表达式 转义字符

    一.这篇文章写的很好,值得看看 两个重点: 1.两次转义 (1)Java 转义(具体规则待学习) Java 中的普通字符串,需要经过 Java 的转义 (2)正则转义(具体规则待学习) Java 代码 ...

  9. java 正则 实例_Java正则表达式示例

    正则表达式定义链接: 应用实例: 统计一个Java字符串中的单词数量 public class Nn { public static void main(String[] args) { String ...

最新文章

  1. 存在量词后必须用合取式?-数学
  2. 封装一个计时器,记录页面的停留时间
  3. Apache常用配置
  4. dotnet vs code mysql_.net 5 用vs code链接mysql体验
  5. SQLServer Agent无法启动,提示错误1069
  6. rsa PHP用法,RSA常见用法整理
  7. 【4】Kafka集群启动/关闭脚本
  8. Ubuntu 普通用户无法启动Google chrome
  9. 毕业5年决定你的一生_4
  10. SCHNOKA施努卡:扁线电机定子生产过程中线圈插入
  11. 分卷压缩 C#代码实现
  12. TensorFlow镜像安装(Anaconda)
  13. Android知识体系思维导图
  14. GitHub开源组件集锦
  15. 向量组/矩阵/秩的理解
  16. 深入理解Plasma(四):Plasma Cash
  17. 不用函数,教你快速查找两张表格中的重复内容。
  18. Unity基本认识——走进Unity
  19. Java并发包concurrent——ConcurrentHashMap
  20. 给你心爱的 npm 包上个『北京户口』

热门文章

  1. 珍藏很久的9个网站,再舍不得也得分享出来
  2. 软件项目管理作业随笔之一:记我完成的一个项目
  3. [RK3399][Android7.1] Uboot启动过程小结
  4. 卸载360之后电脑无法开机
  5. linux命令行挂载NTFS文件系统的移动硬盘
  6. 实现个人微信同时接收企业号消息
  7. 计算机设备国产化替代方案,热推:涉密计算机国产化替代计划
  8. SICK LMS511开发及数据结构分析、坐标转换
  9. 5G与制造业的深度融合推动工业物联网快速发展
  10. 刷脸门禁和无人清扫只是前戏,百度大脑要做最智能的地产物业