2014-02-12 106 views
0

评论我想在源文件中正则表达式的代码文件

写征求意见模式,他们可以/** comments **/

/** 
* comments 
* comments 
**/ 

所以我写的是.. ..

\/\*\*([a-zA-Z0-9\n ]*)*\*\*\/ 

我这样做,是因为我认为一个新的生产线只是一个字符,并把它添加到方括号。

+0

不知道为什么它没有单独的行显示,但在第二个例子包括4线,第一条线/ **然后评论行,然后结束评论标签 –

+1

为您编辑。 – Szymon

+0

比你先生:) –

回答

2

我能想到的两个选项:

(?s)\/\*\*(?:(?!\*\*\/).)*\*\*\/ 

或者

\/\*\*(?:(?!\*\*\/)[\s\S])*\*\*\/ 

第一个是,如果你不介意的话点匹配换行符,第二个是如果你的头脑。

非捕获组是加速它的一个档次,这种负面预测构造阻止匹配**/并匹配其他任何东西。

+0

您可以本地化DOTALL标志的效果:'/ \ * \ *(S:?!(\ * \ * /))* \ * \ * /'。但我没有看到这一点。这样做的唯一原因是,如果你有另外的'*'在你害怕会[与你的对手逃跑(http://www.regular-expressions.info/catastrophic.html) –

+0

正则表达式的其他地方@AlanMoore确实。 – Jerry

+0

谢谢你的帮助。这是我最终做的\ \ * \ * *([\ r \ n] |(\ **([^ * /] | [\ r \ n]))[[* *])* \ * \ * \/ –

-1

您可以尝试以下代码来检测单行注释和多行通信。

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); 
    } 
} 

这将计算代码中的注释总数。

+0

你在非匹配字符串上测试了那个正则表达式吗?因为这是[灾难性回溯]的教科书示例(http://www.regular-expressions.info/catastrophic.html)。尝试从测试字符串中的多行注释中删除最后一个斜杠,您应该明白我的意思。 –

-1

试试这个...

/\*((\w)?(\W)?)*\*/

+0

但是,你能解释OP的问题是什么,以及你的正则表达式如何解决它?没有违法意图,但“试试这个”,一个未经测试的正则表达式是一个非常低质量的答案。我知道它没有经过测试,因为它匹配从第一个'/ *'到最后一个'* /'的所有内容。这也是非常低效的,并且在更长的输入上容易[灾难性的回溯](http://www.regular-expressions.info/catastrophic.html)。 –

0

匹配多行注释可以将其划分为“安全”部分来完成,即,保证零件不包含*/,但他们应该仍然匹配任何数量的其他*/。这可以通过在任何*/之间至少要求一个“安全”字符来完成。安全字符是任何字符,但是*/。然后,每个部分将是这样的:

\**[^\*\/]+\/* 

一个安全的一部分与任意数量的*开始,接着由至少一个安全特性,后跟任意数量的/。多行注释可能会以许多*后面没有安全字符开头,或者以任何数字开头并且没有以安全字符作为前缀,因此它们也必须考虑在内。

结果后跟任意数量的安全部件,然后\*+\/\/\*\/*,即

\/\*\/*((\**[^\*\/]+\/*)*)\*+\/