正则表达式问题

y0nder 2012-10-31 08:29:18
假如我现在有一个字符串是 "a(,),b(c(,),)"
如果我想用正则表达式匹配到如下的结果,
matcher.group(1) = "a(,)"
matcher.group(2) = "b(c(,),)"
该怎么写....想得头都大了
...全文
209 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
y0nder 2012-11-07
  • 打赏
  • 举报
回复
引用 8 楼 tiwerbao 的回复:
LZ,或者你可以通过解析字符串来解决问题,下面是字符串解析的代码,你看看,也许能找到点思路 :) Java code12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 public static void main(Str……
之前问题解决了也就忘记来看了,今天发现还有人来回答了.谢谢了,思路和我的差不多.已结贴
LiangGzone 2012-11-02
  • 打赏
  • 举报
回复
楼上正解
Jacky-止涯 2012-11-02
  • 打赏
  • 举报
回复
LZ,或者你可以通过解析字符串来解决问题,下面是字符串解析的代码,你看看,也许能找到点思路 :)


public static void main(String[] args) {
String str = "a(c(d(g(,),),f(,))),b(,e(,))";
List<String> paramList = analysisStr(str);
for (String s : paramList) {
System.out.println(s);
}
}
/**
* Description: 解析字符串,截取【从字母开头,紧跟()的参数】,如 a(...) <br>
*/
public static List<String> analysisStr(String template) {
int iBegin = -1; // ( 位置
int iEnd = -1; // ) 位置
int level = -1; // ()层级 控制获取的{}是否同步
boolean isFirstLetter = true;
List<String> paramList = new ArrayList<String>();

for (int i = 0; i < template.length(); i++) {
// 如果是字母,而且是第一个,就算领头字母
if (isFirstLetter && Character.isLetter(template.charAt(i))) {
iBegin = i;
isFirstLetter = false;
}
if ('(' == template.charAt(i)) {
// 只获取第一层
if (level == -1) {
isFirstLetter = false;
}
level++;
continue;
}
if (')' == template.charAt(i)) {
// 第一层参数处理
if (level == 0) {
iEnd = i;
paramList.add(template.substring(iBegin, iEnd + 1));

// continue下一片段匹配
iBegin = -1;
iEnd = -1;
level = -1;
isFirstLetter = true;
}
else if (level > 0) {
level--; // 只匹配第一层
}
continue;
}
}
return paramList;
}
wapigzhu 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

Pattern p =Pattern.compile("(.\\(,\\)),(.\\(.\\(,\\),\\))");

这个只能在我这个例子里实现- -!
如果我把字符串改成
a(b(,e(,)),c(d(g(,),),f(,)))
就不能匹配成
matcher.group(1) = "a(b(,e(,))"
matcher.group(2) =……
[/Quote]
java不支持平衡组吧..
y0nder 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:

引用 3 楼 的回复:

Pattern p =Pattern.compile("(.\\(,\\)),(.\\(.\\(,\\),\\))");

这个只能在我这个例子里实现- -!
如果我把字符串改成
a(b(,e(,)),c(d(g(,),),f(,)))
就不能匹配成
matcher.group(1) = "a(b(,e(,))"
ma……
[/Quote]
是的不支持,所以我就自己实现了个...

public static int regexHelper(Matcher matcher) {//返回正中央的逗号
int n = 0;
while(matcher.find()) {
String s = matcher.group();
switch(s) {
case "(":
n++;
break;
case ")":
n--;
break;
case ",":
if(n == 0) {
return matcher.end();
}
break;
}
if(n < 0) {
return -1;
}
}
if(n > 0) {
return -1;
} else {
return 0;
}
}
y0nder 2012-10-31
  • 打赏
  • 举报
回复
其实就是个2叉树的广义表,我知道用堆栈可以实现利用广义表创建二叉树,就是想看看能不能用正则实现.
y0nder 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

Pattern p =Pattern.compile("(.\\(,\\)),(.\\(.\\(,\\),\\))");
[/Quote]
这个只能在我这个例子里实现- -!
如果我把字符串改成
a(b(,e(,)),c(d(g(,),),f(,)))
就不能匹配成
matcher.group(1) = "a(b(,e(,))"
matcher.group(2) = "c(d(g(,),),f(,)))"

我自己搜索了下,目测是要用到平衡组这个东西,正在研究中...
有能人不吝赐教
Mr_sunboy 2012-10-31
  • 打赏
  • 举报
回复
Pattern p =Pattern.compile("(.\\(,\\)),(.\\(.\\(,\\),\\))");
y0nder 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

这个不难 自己参看APi就知道了。上面写得很详细。我不想去帮你做,因为这不是我要解决的问题呵呵。
引用楼主 的回复:
假如我现在有一个字符串是 "a(,),b(c(,),)"
如果我想用正则表达式匹配到如下的结果,
matcher.group(1) = "a(,)"
matcher.group(2) = "b(c(,),)"
该怎么写....想得头都大了
[/Quote]
如果没看API我会来问么- -!
fearlessMore 2012-10-31
  • 打赏
  • 举报
回复
这个不难 自己参看APi就知道了。上面写得很详细。我不想去帮你做,因为这不是我要解决的问题呵呵。
[Quote=引用楼主 的回复:]
假如我现在有一个字符串是 "a(,),b(c(,),)"
如果我想用正则表达式匹配到如下的结果,
matcher.group(1) = "a(,)"
matcher.group(2) = "b(c(,),)"
该怎么写....想得头都大了
[/Quote]

62,621

社区成员

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

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