我是正则表达式的新手,我使用这个if[\\s]*\\([^\\)]*\\)[\\s]*\\{((/\\*(.|[\\r\\n])*?\\*/)|\\s)*\\}
找到空的IF语句,并且它使用空语句但没有找到单行注释的精细多行注释。它找到了以下场景
if (true) {
/*
* fsdsddgd ddgdgdfg gdfgdgdfg gdfgdfg fgdfgfg
*/
/*
* fsdsddgd ddgdgdfg gdfgdgdfg gdfgdfg fgdfgfg
*/
}
if (true) {
}
找不到以下情景
if (true) {
// kavi
// kamal
// kamal
}
if (true) {
// kavi
}
请为此提供有价值的解决方案。
答案 0 :(得分:3)
不是一个好主意,但如果你必须......
正如你在评论中看到的那样,我并不十分喜欢这个想法,但是既然你提出了这个想法,那么这将符合你的意见(见demo):
if\s*\([^\{]*\{(?:[ \t]*//.*)?[ \t]*(?:[\r\n]*[ \t]*(?://.*)?)*[\r\n]*[ \t]*(?://.*)?}
if\s*\([^\{]*\{
让我们到了大括号(?:[ \t]*//.*)?[ \t]*
让我们到达行尾,与(?:[\r\n]*[ \t]*(?://.*)?)*
匹配一系列带有可选评论的行[\r\n]*[ \t]*(?://.*)?}
让我们进入最后的支撑。需要正确转义令牌,因此请尝试以下代码:
List<String> matchList = new ArrayList<String>();
try {
Pattern regex = Pattern.compile("if\\s*\\([^\\{]*\\{(?:[ \t]*//.*)?[ \t]*(?:[\r\n]*[ \t]*(?://.*)?)*[\r\n]*[ \t]*(?://.*)?}");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
否则
在评论中,您可能不希望else if
在这种情况下,请使用:
(?<!else )if\s*\([^\{]*\{(?:[ \t]*//.*)?[ \t]*(?:[\r\n]*[ \t]*(?://.*)?)*[\r\n]*[ \t]*(?://.*)?
在代码中:
List<String> matchList = new ArrayList<String>();
try {
Pattern regex = Pattern.compile("(?<!else )if\\s*\\([^\\{]*\\{(?:[ \t]*//.*)?[ \t]*(?:[\r\n]*[ \t]*(?://.*)?)*[\r\n]*[ \t]*(?://.*)?");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
如果您有任何疑问,请告诉我们。