正则表达式括号匹配问题

qq631032049 2013-07-19 02:55:38
使用正则表达式提取括号内容,此处考虑多重括号的情况,该怎么做?
比如:
table('aa','bb',cc)+('ad.get()',ad.getid(),'ad.getdescription()')
要能提取出来
'aa','bb',cc
'ad.get()',ad.getid(),'ad.getdescription()'
这两部分就可以,怎么写正则,求此方面大神指教!
...全文
309 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
失落夏天 2013-07-20
  • 打赏
  • 举报
回复
引用 2 楼 oh_Maxy 的回复:
涉及括号匹配,估计正则搞不定。
其实正则没什么搞不定,只有效率的高低和程度的深浅。。 为了这个专门学了一会,搞定了。。 楼主看看吧

String s="table('aa','bb',cc)+('ad.get()',ad.getid(),'ad.getdescription()')";
		Pattern p=Pattern.compile(".*?\\((.*?)(?<!\\()\\)");
		Matcher m=p.matcher(s);
		while(m.find()){
			System.out.println(m.group(1));
		}
结果: 'aa','bb',cc 'ad.get()',ad.getid(),'ad.getdescription()'
qq631032049 2013-07-20
  • 打赏
  • 举报
回复
引用 6 楼 fangmingshijie 的回复:
		String s = "table('aa','bb',cc)+('ad.get()',ad.getid(),'ad.getdescription()')";
		Pattern ptn = Pattern.compile("\\+\\((.*?)\'\\)");
		Matcher mather = ptn.matcher(s);
		while (mather.find()) {
			System.out.println(mather.group(1));//结果是'ad.get()',ad.getid(),'ad.getdescription(),少一个',可以System.out.println(mather.group(1)+"'");

		}
这个不太准确,我是要同时获得前面的 'aa','bb',cc ,它的外面也有括号的,你的表达式和我写的差不多,利用贪婪匹配原则的确可以得到后半部分的值的。
oh_Maxy 版主 2013-07-20
  • 打赏
  • 举报
回复
引用 8 楼 AA5279AA 的回复:
[quote=引用 2 楼 oh_Maxy 的回复:] 涉及括号匹配,估计正则搞不定。
其实正则没什么搞不定,只有效率的高低和程度的深浅。。 为了这个专门学了一会,搞定了。。 楼主看看吧

String s="table('aa','bb',cc)+('ad.get()',ad.getid(),'ad.getdescription()')";
		Pattern p=Pattern.compile(".*?\\((.*?)(?<!\\()\\)");
		Matcher m=p.matcher(s);
		while(m.find()){
			System.out.println(m.group(1));
		}
结果: 'aa','bb',cc 'ad.get()',ad.getid(),'ad.getdescription()'[/quote] 厉害~
花木兰1闪21A 2013-07-20
  • 打赏
  • 举报
回复

public static void main(String arg[]) {
		String string = "table('aa','bb',cc)+('ad.get()',ad.getid(),'ad.getdescription()')";
		String regex = "\\((.*?)(?<!(\\()|\\()\\)";
		Pattern pattern = Pattern.compile(regex);
		Matcher m = pattern.matcher(string);
		while (m.find()) {
			System.out.println(m.group(1));
		}
	}


'aa','bb',cc
'ad.get()',ad.getid(),'ad.getdescription()'
  • 打赏
  • 举报
回复
		String s = "table('aa','bb',cc)+('ad.get()',ad.getid(),'ad.getdescription()')";
		Pattern ptn = Pattern.compile("\\+\\((.*?)\'\\)");
		Matcher mather = ptn.matcher(s);
		while (mather.find()) {
			System.out.println(mather.group(1));//结果是'ad.get()',ad.getid(),'ad.getdescription(),少一个',可以System.out.println(mather.group(1)+"'");

		}
oh_Maxy 版主 2013-07-19
  • 打赏
  • 举报
回复
引用 3 楼 qq631032049 的回复:
[quote=引用 2 楼 oh_Maxy 的回复:] 涉及括号匹配,估计正则搞不定。
那有没有一个笨点的办法啊?不用栈进行括号匹配的,我是想把后面部分的括号去掉,然后用spilt(","),不知道可行不?[/quote] 可以: 按字符遍历字符串,找到左括号,记录其下标,并计数器+1;找到右括号计数器-1,此时判断计数器为0,则记录下标,得到括号内容。 大致这样,可能思路还需要优化
qq631032049 2013-07-19
  • 打赏
  • 举报
回复
贪婪匹配太不灵活了
qq631032049 2013-07-19
  • 打赏
  • 举报
回复
引用 2 楼 oh_Maxy 的回复:
涉及括号匹配,估计正则搞不定。
那有没有一个笨点的办法啊?不用栈进行括号匹配的,我是想把后面部分的括号去掉,然后用spilt(","),不知道可行不?
oh_Maxy 版主 2013-07-19
  • 打赏
  • 举报
回复
涉及括号匹配,估计正则搞不定。
qq605868686 2013-07-19
  • 打赏
  • 举报
回复
表示要我解决我只会split字符串,正则..... 同求大牛吧

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧