如何一次排除多个字符。
我需要编写可以检查java多行注释是否没有结束的正则表达式。
例如两条评论
/* some comment */
和
/* Multi line comment start
正则表达式代码必须与第二条评论匹配,但不能与第一条评论匹配。
我试过像
这样的东西\/\*(.*)[^\*\/]
但这只排除了一个角色。如何一次排除两个。
答案 0 :(得分:1)
一种解决方案是使用*
上的.(?!\*\/)
量词:
^\/\*(?:.(?!\*\/))*$
这意味着只要在要匹配的内容之后没有*/
,它就会匹配任何内容。
然而,这需要很多步骤。如果我是你,我会在*/
之前和之后匹配评论,并将*/
部分放在一个组中。如果该组存在,那么它结束,否则评论没有结束。
答案 1 :(得分:0)
因为在面对未闭合的多行注释块时您不知道应该匹配多少行。因为您不知道/*
是否放在字符串文字或结尾*/
分隔符内。但是如果你想匹配/*
所在的一行(当前行),你可以这样做:
(?m)^\h*/\*(?!(?>(?!/\*)[\s\S])*\*/).*
故障:
(?m)
启用多行修饰符^
断言行开头\h*
匹配horizental空格(如果有的话)/\*
匹配多行注释块的开头(?!
开始否定前瞻
(?>
开始原子分组
(?!/\*)
如果接下来的两个字符不是/ * [\s\S]
匹配下一个字符)*
重复尽可能多的\*/
匹配块结束)
否定前瞻结束.*
匹配当前行中的所有内容Java代码:
String regex = "(?m)^\\h*/\\*(?!((?!/\\*)[\\s\\S])*\\*/).*";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
答案 2 :(得分:0)
答案 3 :(得分:0)
Do you want something like this?
\/\*\s*((?!\*\/|\/\*)[\s\S])*(?=\/\*|$)
\/\*\s* : matching the start of multi-line comment
(?=\/\*|$) : ending pattern (new comment start \/* or end of the text $ )
((?!\*\/|\/\*)[\s\S])* : stop present matching process and start new one when meets */ or \/*
[Test sample text]
/* some c
omment */
/* Multi line comment start
fdsafdsa
/*
/* fds
sa */
/* fjdslajfdl
/*fjdl */ /* fjdls
fjdls
/* */ /*fdls
jfdla*/ /* fdlsajfl
fdsa
/*end*/