`
alex1960
  • 浏览: 62692 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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)

 

 

 

0
2
分享到:
评论
3 楼 joaboo 2013-06-01  
alex1960 写道
Stack用来验证括号匹配确实要简单易理解些,但是如果要提取匹配的内容就要做复杂的判断了。

还好吧..字符串匹配到括号就记录下标索引,完了再提取就好了...
2 楼 alex1960 2013-06-01  
Stack用来验证括号匹配确实要简单易理解些,但是如果要提取匹配的内容就要做复杂的判断了。
1 楼 joaboo 2013-06-01  
佩服LZ...我是一看正则就头晕....
另:感觉用Stack来实现更能令人接受一点....

相关推荐

    正则表达式做验证的范例

    这个是用正则表达式做验证的范例 相比于if等类型做验证要简单的多

    java正则表达式实例

    * 匹配的例子: * (GC_F_BA_ACD_FDALFD_I_FALDJF) * (GC_F_BA_ACD_FDALFD) * (GC_F_BA_ACD)等 * * 解释 * \\( \\)表示:前后的一对小括号 * * [A-Z]+(\\_[A-Z]+)* * [A-Z]+ 1个或多个大写字母 * (\\_[A...

    正则表达式只可以输入只允许输入中文、数字、字母、下划线

    正则表达式只可以输入只允许输入中文、数字、字母、下划线

    java 正则表达式

    JAVA正则表达式语法(转)正则表达式语法正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式示例表达式 ...

    java正则表达式获取大括号小括号内容并判断数字和小数亲测可用

    //匹配大括号 private static String regexx = "\\(([^}]*)\\)";//匹配小括号 public static void main(String[] args) { String dakuohao = "{a+b}={c+d}>{d}"; Pattern compile = Pattern.compile(regex); ...

    精通正则表达式~~~

    使用正则表达式匹配文本... 38 向更实用的程序前进... 40 成功匹配的副作用... 40 错综复杂的正则表达式... 43 暂停片刻... 49 使用正则表达式修改文本... 50 例子:公函生成程序... 50 举例:修整股票价格....

    正则表达式去除中括号(符号)及里面包含的内容

    ps:下面看下利用正则表达式提取括号内内容 比如现在要提取 中华人们共和国,简称(中国) 这句话中括号里的“中国” import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { ...

    正则表达式

    正则表达式还支持圆括号表达式,圆括号表达式用于将多个表达式组成一个子表达式,圆括号中可以使用或运算符(|),例如正则表达式 “(public|protected|private)”用于匹配Java三个访问控制符其中之一。 4、 使用正则...

    Java 正则表达式详解

    如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。 正则表达式30分钟入门教程 常用正则表达式 许多语言,包括Perl、PHP、Python、...

    正则表达式经典实例

    即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB...

    正则表达式经典实例.pdf

    即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB...

    正则表达式30分钟入门教程

    \d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。 \d{5}-\d{4}|...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * Summary of regular-expression constructs 正则表达式结构简介: * Construct Matches * Characters 字符: * x The character x x 字符 x * \\ The ...

    Java正则表达式中的反向引用

    Java正则表达式中的反向引用是Java提供的另一个重要功能。 要了解反向引用,我们首先需要了解群组。正则表达式中的分组意味着将多个字符视为一个单元。通过将要分组的字符放在一组括号“()”中来创建它们。每组...

    Java正则表达式提取字符的方法实例

    正好遇到一个需求需要将字符串中特定的字符全部提取出来,这个如果是按常规的字符串处理的话非常的繁琐。于是想到用正则表达式来完成。...// 把要匹配的字符串写成正则表达式,然后要提取的字符使用括号括起来 //

    javascript正则表达式总结

    Regexpal是一个在线Javascript正则表达式处理器,地址是:http://www.regexpal.com 学习正则重要的是实践操作,不妨举个栗子: 匹配号码:707-827-7019 字符组匹配 [0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9]...

    javascript正则表达式参数/g与/i及/gi的使用指南

    请回想一下,对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 ‘?:’, ‘?=’, or ‘?!’ 来忽略对这部分正则表达式的保存。  所捕获的每个子匹配都...

    正则表达式其实就是一个特殊的字符串

    java正则表达式提供了比较丰富的类库,大大简化了这个过程。下面列出常用的基本语法: * + ? ^ $ [] () | / \ \d \D \w \W {} {n} {n,m}等, 要注意的是“|”或符号。它可以匹配单个字符和字符串。如:t[aeio]n只...

    教你轻松搞定javascript中的正则

    test3 正则表达式中的特殊字符3.1 正则表达式的组成3.2 边界符3.3 字符类3.4 量词符3.5 括号总结3.6 预定义类4 正则表达式中的替换4.1 replace 替换4.2 正则表达式参数总结 1 正则表达式概述 1.1 什么是正则表达式 ...

Global site tag (gtag.js) - Google Analytics