我无法让正则表达式匹配模式"(cmd: .*)"
例如,我想匹配"(cmd: cd $HOME)"
。
这是我的正则表达式:\(cmd:\s+.*\)
问题是,这也会匹配"(cmd: char) ()"
。由于正则表达式中有".*"
,因此它将匹配所有")"
,直到它看到的最后一个"(cmd: (asd) )"
。我如何修改正则表达式,使其与")"
匹配,但如果"("
没有匹配的"(cmd: asd) )"
则不匹配。因此,例如,正则表达式与此字符串的最后一个括号不匹配:{{1}}。
答案 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)