免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 24323 | 回复: 9
打印 上一主题 下一主题

关于用正则表达式中括号的匹配问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-16 23:14 |只看该作者 |倒序浏览
预搜索原始字符串为:FS1 + YE2 + INCL04(OBJ3 + FS4 - YE5 * 0.3 + INCL02(OBJ * 0.25))

现在我要搜索以INCL开头后面是2位数字,后面是括号,但要求找到该括号所包括的最大范围,在该范围内有可能还会出现该模式。
因此第一次搜寻的结果为:INCL04(OBJ3 + FS4 - YE5 * 0.3 + INCL02(OBJ * 0.25))
第二次搜索的结果为:INCL02(OBJ * 0.25)
现在我只能利用正则表达式找到要匹配的起始位置
即:pattern = INCL\d{2} 但如何通过动态指定括号的个数(个数不定)来找到该模式所对应的最大范围呢?

论坛徽章:
0
2 [报告]
发表于 2005-08-17 12:06 |只看该作者

关于用正则表达式中括号的匹配问题?

只用正则表达式好像很难啊,如果我就直接用栈算拉。匹配的入栈,遇到)就出栈,算长度。各位有什么好方法吗

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2005-08-17 12:13 |只看该作者

关于用正则表达式中括号的匹配问题?

INCL[0-9][0-9](.*)

论坛徽章:
0
4 [报告]
发表于 2005-08-17 12:50 |只看该作者

关于用正则表达式中括号的匹配问题?

回楼主,正则默认就是最大匹配,所以您的问题waker先生那样就会直接给一个
INCLXX(中间任意字符,包括括号在内) 的最大匹配。

相反最短匹配更为麻烦一些呢。

论坛徽章:
0
5 [报告]
发表于 2005-08-17 13:08 |只看该作者

关于用正则表达式中括号的匹配问题?

哦,对啊,他只要最长的匹配,直接匹配就可以了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-08-17 16:07 |只看该作者

关于用正则表达式中括号的匹配问题?

那第二次呢?
INC 前加個 space 不是可否?

论坛徽章:
0
7 [报告]
发表于 2005-08-17 16:55 |只看该作者

关于用正则表达式中括号的匹配问题?

想问楼主是要每次的匹配都打出来还是只要最长的那个匹配
而且INCL[0-9][0-9](.*)在INCL02(OBJ * 0.25) + INCL02(OBJ * 0.25)这样的情况下好像也会有问题。

论坛徽章:
0
8 [报告]
发表于 2005-08-18 00:04 |只看该作者

关于用正则表达式中括号的匹配问题?

谢谢各位帮忙
实际上我要在这里做循环处理,最终每一个INCLXX()是我要算的一个表达式,里面有可能又嵌套了一个这样的表达式,每次我需要找到一个该表达式所对应的最大范围,然后判断里面是否还有这样的表达式,如果存在需要递归处理,我需要用JAVA来实现这样的功能,我自己也写了一个方法能够实现这样的功能,通过判断左右括号的个数是否相等来找到最大范围,但我想知道这样的功能正则表达式能否实现。

以下是我用JAVA实现的方法:
其中pattern定义为
private static final String NESTING_FORMULA_PATTERN = "INCL\\d{2}";

public String getFormulaExpression(String expression) {
    Pattern pattern = Pattern.compile(NESTING_FORMULA_PATTERN);
    Matcher matcher = pattern.matcher(expression);
   
    String formulaExpression = null;
   
    if (matcher.find()) {
        int beginIdx = expression.indexOf('(', matcher.end());
        int endIdx = expression.length();
   
        int left = 0;
        int right = 0;
        for (int i = beginIdx; i < endIdx; i++) {
            if (expression.charAt(i) == '(') left++;
            else if (expression.charAt(i) == ')') right++;
            
            if (left == right) {
                endIdx = i;
                break;
            }
        }

        formulaExpression = expression.substring(beginIdx + 1, endIdx);
    }
   
    return formulaExpression;
}

论坛徽章:
0
9 [报告]
发表于 2005-08-18 10:58 |只看该作者

关于用正则表达式中括号的匹配问题?

既然这样,用viton_xuan先生提供的(入栈,)出栈的方式或许是比较好的解决方案。 因为用正则匹配存在()()()类和(())()及(()())等情况,随着()的增加,情况更多,用记录出入栈的方式我个人觉得更方便一些。

当然也可能是我正则使用功底不够,关注其他朋友的方案

论坛徽章:
0
10 [报告]
发表于 2010-06-10 21:01 |只看该作者
刚刚搜索了这个问题,网上找到了一个解答,就转贴过来吧。
http://tieba.baidu.com/f?kz=267197381
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP