如何使这个正则表达式贪婪

时间:2013-08-01 16:08:09

标签: regex regex-greedy

这个正则表达式(每个\的额外\是因为它在java代码中

\\*\\{[\\w\\W]*\\}\\*

实际是

\*\{[\w\W]*\}\*

但是这个表达在} *方面并不贪心。我正在尝试匹配 {和} 之间的所有内容,所以如果我有

*{ some comment }* hi there and some stuff *{ comment 2 }* and soe more stuff

应该以

结束
hi there and some stuff and soe more stuff

但相反,它不够贪心。这里有关于贪婪的信息,我想我想要那里的X1

\\*\\{[\\w\\W]*\\}1\\* or \\*\\{[\\w\\W]*\\}{1}\\*

但这不起作用。在这个例子中,如何使用他们的X {n}来强迫贪婪?

2 个答案:

答案 0 :(得分:4)

将ReplaceAll替换为正则表达式,但添加?,以便[\ w \ W]不会贪婪,如下所示:

String yourString = "*{ some comment }* hi there and some stuff *{ comment 2 }* and soe more stuff";
yourString.replaceAll("\\*\\{[\\w\\W]*?\\}\\*","");

然后你会得到hi there and some stuff and soe more stuff

答案 1 :(得分:2)

尝试这样的事情:

\*\{((?!\}\*).)*\}\*

或者以Java形式:

\\*\\{((?!\\}\\*).)*\\}\\*

它使用negative lookahead来区分}*结束标记与}。这是((?!\}\*).)*部分。

编辑:这是一个允许换行的(Java)版本。您还可以使用Pattern.DOTALL使.包含换行符,以便上述模式生效。

\\*\\{((?!\\}\\*)[\\s\\S])*\\}\\*

请注意,这不会是递归的。你不能拥有*{ foo *{ bar }* }*这样的东西,并将整个事情视为评论。这将使这成为一个无上下文的语法,trying to parse CFGs is among the most famous no-nos with regex