正则表达式怎样匹配成对的括号?

LDW_1988 2012-09-18 11:03:54
遇到些问题:
((520+480)*38/10)/2
如果像这样有层次嵌套的则用 "\(.*\)" 就能全被匹配到
但像这样(((520+480)*38/10)/2*((520+480)*38/10)/2)) 应该怎样匹配呢?
谁有好的方法分享一下
...全文
5543 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
安特矮油 2012-09-18
  • 打赏
  • 举报
回复
这个用这则恐怕是有点难度,把它转成char[]然后来一个个匹配吧,这样可能更好处理一些
LDW_1988 2012-09-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

刚写了一个,应该可以用,你试试吧。
Java code

public class Test{

public static void main(String[] args) {
String s = "(((520+480)*38/10)/2*((520+480)*38/10)/2)) ";
List<Char> list = new Arr……
[/Quote]
分给错了!
感谢感谢!
cscript 2012-09-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

刚写了一个,应该可以用,你试试吧。
Java code

public class Test{

public static void main(String[] args) {
String s = "(((520+480)*38/10)/2*((520+480)*38/10)/2)) ";
List<Char> list = new Arr……
[/Quote]

lost_guy_in_scut 2012-09-18
  • 打赏
  • 举报
回复
楼上牛逼啊。
丫的,你这是要做个词法分析器了。
安特矮油 2012-09-18
  • 打赏
  • 举报
回复
刚写了一个,应该可以用,你试试吧。

public class Test{

public static void main(String[] args) {
String s = "(((520+480)*38/10)/2*((520+480)*38/10)/2)) ";
List<Char> list = new ArrayList<Char>();
do{
s = getString(s, list);
}while(s != null && s.indexOf("(") != -1);
for(Char c : list){
System.out.println(c.str.substring(c.startIndex, c.endIndex + 1));
}
}

public static String getString(String str, List<Char> list){
char[] cs = str.toCharArray();
boolean isStart = false;
Char ch = new Char();
ch.str = str;
for(int i = 0; i < cs.length; i++){
char c = cs[i];
if(c == '('){
if(!isStart){
ch.startIndex = i;
isStart = true;
}
ch.layer++;
}else if (c == ')' && ch.layer > 0){
ch.layer--;
if(ch.layer == 0){
ch.endIndex = i;
list.add(ch);
if(i != cs.length - 1){
String last = str.substring(i + 1);
do{
last = getString(last, list);
}while(last != null && last.indexOf("(") != -1);
}
break;
}
}
}
if(ch.endIndex != 0){
return str.substring(ch.startIndex + 1, ch.endIndex);
}
return null;
}

}
class Char{
int startIndex;
int endIndex;
int layer;
String str;
}

62,633

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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