评论我想在源文件中正则表达式的代码文件
写征求意见模式,他们可以/** comments **/
或
/**
* comments
* comments
**/
所以我写的是.. ..
\/\*\*([a-zA-Z0-9\n ]*)*\*\*\/
我这样做,是因为我认为一个新的生产线只是一个字符,并把它添加到方括号。
评论我想在源文件中正则表达式的代码文件
写征求意见模式,他们可以/** comments **/
或
/**
* comments
* comments
**/
所以我写的是.. ..
\/\*\*([a-zA-Z0-9\n ]*)*\*\*\/
我这样做,是因为我认为一个新的生产线只是一个字符,并把它添加到方括号。
我能想到的两个选项:
(?s)\/\*\*(?:(?!\*\*\/).)*\*\*\/
或者
\/\*\*(?:(?!\*\*\/)[\s\S])*\*\*\/
第一个是,如果你不介意的话点匹配换行符,第二个是如果你的头脑。
非捕获组是加速它的一个档次,这种负面预测构造阻止匹配**/
并匹配其他任何东西。
您可以本地化DOTALL标志的效果:'/ \ * \ *(S:?!(\ * \ * /))* \ * \ * /'。但我没有看到这一点。这样做的唯一原因是,如果你有另外的'*'在你害怕会[与你的对手逃跑(http://www.regular-expressions.info/catastrophic.html) –
正则表达式的其他地方@AlanMoore确实。 – Jerry
谢谢你的帮助。这是我最终做的\ \ * \ * *([\ r \ n] |(\ **([^ * /] | [\ r \ n]))[[* *])* \ * \ * \/ –
您可以尝试以下代码来检测单行注释和多行通信。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class HelloWorld{
public static void main(String []args){
String test="/**\n"
+"* some text\n"
+"* some text\n"
+"**/"
+"non comment\n"
+"/**some text \n**/" +
"//single line comment";
int count=0;
String pattern_string="(\\/\\/)|(\\/\\*(\\*)?([\\*\\w\\d\\s]*(\\n)?)*(\\*)?\\*\\/)";
Pattern pattern=Pattern.compile(pattern_string);
Matcher matcher=pattern.matcher(test);
while(matcher.find())
{
count++;
}
System.out.println(count);
}
}
这将计算代码中的注释总数。
你在非匹配字符串上测试了那个正则表达式吗?因为这是[灾难性回溯]的教科书示例(http://www.regular-expressions.info/catastrophic.html)。尝试从测试字符串中的多行注释中删除最后一个斜杠,您应该明白我的意思。 –
试试这个...
/\*((\w)?(\W)?)*\*/
但是,你能解释OP的问题是什么,以及你的正则表达式如何解决它?没有违法意图,但“试试这个”,一个未经测试的正则表达式是一个非常低质量的答案。我知道它没有经过测试,因为它匹配从第一个'/ *'到最后一个'* /'的所有内容。这也是非常低效的,并且在更长的输入上容易[灾难性的回溯](http://www.regular-expressions.info/catastrophic.html)。 –
匹配多行注释可以将其划分为“安全”部分来完成,即,保证零件不包含*/
,但他们应该仍然匹配任何数量的其他*
和/
。这可以通过在任何*
和/
之间至少要求一个“安全”字符来完成。安全字符是任何字符,但是*
和/
。然后,每个部分将是这样的:
\**[^\*\/]+\/*
一个安全的一部分与任意数量的*
开始,接着由至少一个安全特性,后跟任意数量的/
。多行注释可能会以许多*
后面没有安全字符开头,或者以任何数字开头并且没有以安全字符作为前缀,因此它们也必须考虑在内。
结果后跟任意数量的安全部件,然后\*+\/
\/\*\/*
,即
\/\*\/*((\**[^\*\/]+\/*)*)\*+\/
不知道为什么它没有单独的行显示,但在第二个例子包括4线,第一条线/ **然后评论行,然后结束评论标签 –
为您编辑。 – Szymon
比你先生:) –