0

这个正则表达式(每个\的额外\是因为它在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} 东西来强制贪婪?

4

2 回答 2

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

于 2013-08-01T16:25:16.867 回答
2

尝试这样的事情:

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

或以 Java 形式:

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

它使用负前瞻来区分}*结束标签和}单独的标签。这就是((?!\}\*).)*部分。

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

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

请注意,这不会是递归的。您不能拥有类似的东西*{ foo *{ bar }* }*并将整个事情视为评论。这将使它成为一种上下文无关的语法,并且尝试解析 CFG 是 regex 最著名的禁忌之一

于 2013-08-01T16:22:32.927 回答