正则表达式 - 匹配模式“(cmd :)”

时间:2014-08-08 13:44:49

标签: java regex

我无法让正则表达式匹配模式"(cmd: .*)" 例如,我想匹配"(cmd: cd $HOME)"

这是我的正则表达式:\(cmd:\s+.*\)

问题是,这也会匹配"(cmd: char) ()"。由于正则表达式中有".*",因此它将匹配所有")",直到它看到的最后一个"(cmd: (asd) )"。我如何修改正则表达式,使其与")"匹配,但如果"("没有匹配的"(cmd: asd) )"则不匹配。因此,例如,正则表达式与此字符串的最后一个括号不匹配:{{1}}。

4 个答案:

答案 0 :(得分:2)

给你一个Java实现示例如下:

    String str3 = "(cmd: (((char))) (ddt)) ()";
    String regexp = "\\(cmd: "+ nestingPair(5, '(', ')')+ "\\)";
    Pattern pMod = Pattern.compile(regexp);
    Matcher mMod = pMod.matcher(str3);
    while (mMod.find()) {
        System.out.println(mMod.group(0));
    }

public String nestingPair(int level, char b, char e) {
    String ret = "";
    if (level <= 0) { return ret; }

    String common = "(?>[^" + b + e + "]*(?>\\\\" + b + "888_888" + "\\\\" + e + ")*[^" + b + e
            + "]*)*";
    String core = "[^" + b + e + "]*";
    String replace = "(?>[^" + b + e + "]*(?>\\" + b + "888_888" + "\\" + e + ")*[^" + b + e
            + "]*)*";
    for (int i = 0; i < level - 1; i++) {
        // System.out.println(replace);
        replace = replace.replaceFirst("888_888", common);
    }
    // System.out.println(replace);
    ret = replace.replaceAll("888_888", core);

    return ret;
}

然后,输出是:

(cmd: (((char))) (ddt))  

一句话:可以根据您的实际要求设置递归级别。 (在我的样本中,我将它设置为5,通常,我认为已经足够了。我已经尝试了500,它没问题。但是对于1000,它将是StackOverFlow)。
通常,Java-regex不支持使用嵌套括号或任何其他嵌套字符的匹配文本。 (例如(),{},[],&lt;&gt;等) 有一个开源项目"jree",它提供了这种支持。 FYI。

答案 1 :(得分:1)

我会添加另一个组来捕获你需要的东西。

^\(cmd\:(.*)\)$

答案 2 :(得分:0)

使用正则表达式无法实现此目的。括号或括号匹配需要递归/计数功能,这在正则表达式中是不可用的。你需要一个解析器。

此处提供了更多详细信息:http://blogs.msdn.com/jaredpar/archive/2008/10/15/regular-expression-limitations.aspx

答案 3 :(得分:0)

你想要一个允许匹配括号的正则表达式,但只有它们是配对的。像这个正则表达式:

\(cmd:\s+([^()]*\([^()]\))*[^()]*\)

请参阅live demo