java正则匹配_JAVA正则表达式匹配括号
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正则校验加减乘除,正则表达式匹配加减法算法
搜索热词 通过键盘输入100以内正整数的加.减运算式,请编写一个程序输出运算结果字符串. 输入字符串的格式为:"操作数1 运算符 操作数2","操作数"与&qu ...
- java 正则 实例_Java正则表达式实例详解
创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...
- java 正则 排除_Java正则表达式:排除单词/字符串
如果要在搜索模式中排除某个单词/字符串,那么执行此操作的一种好方法是正则表达式断言函数.如果您要匹配不跟随其他东西的东西,这是必不可少的. 一个简单的例子 String str = "pro ...
- java正则 转义_java – 正则表达式和转义和未转义的分隔符
你可以使用正则表达式 (?:\\.|[^;\\]++)* 匹配未转义分号之间的所有文本: List matchList = new ArrayList(); try { Pattern regex = ...
- java 数字匹配_java正则表达式匹配数字怎么实现?
正则表达式中如何匹配当中数字?这是正则表达式经典例题之一,下面小编就带你一起看看它的实现.// 去除可能带有的数字 private static void test6() { // 提取张三 去除数字 ...
- java 正则 大括号_java正则表达式获取大括号之间的内容
"; String reg2 = " "; System.out.println(test.replaceAll(reg, "###")); Syst ...
- java正则 链接_Java正则表达式获取网址和链接文字解析
很久不写正则表达式了,网上看到个面试题关于提取, 各种乱七八糟的解法. 正确的,应该是这样吧: import java.util.regex.Matcher; import java.util.reg ...
- java正则转义_Java 正则表达式 转义字符
一.这篇文章写的很好,值得看看 两个重点: 1.两次转义 (1)Java 转义(具体规则待学习) Java 中的普通字符串,需要经过 Java 的转义 (2)正则转义(具体规则待学习) Java 代码 ...
- java 正则 实例_Java正则表达式示例
正则表达式定义链接: 应用实例: 统计一个Java字符串中的单词数量 public class Nn { public static void main(String[] args) { String ...
最新文章
- 存在量词后必须用合取式?-数学
- 封装一个计时器,记录页面的停留时间
- Apache常用配置
- dotnet vs code mysql_.net 5 用vs code链接mysql体验
- SQLServer Agent无法启动,提示错误1069
- rsa PHP用法,RSA常见用法整理
- 【4】Kafka集群启动/关闭脚本
- Ubuntu 普通用户无法启动Google chrome
- 毕业5年决定你的一生_4
- SCHNOKA施努卡:扁线电机定子生产过程中线圈插入
- 分卷压缩 C#代码实现
- TensorFlow镜像安装(Anaconda)
- Android知识体系思维导图
- GitHub开源组件集锦
- 向量组/矩阵/秩的理解
- 深入理解Plasma(四):Plasma Cash
- 不用函数,教你快速查找两张表格中的重复内容。
- Unity基本认识——走进Unity
- Java并发包concurrent——ConcurrentHashMap
- 给你心爱的 npm 包上个『北京户口』