用java正则表达式提取java程序中的注释

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java正则表达式提取java程序中的注释相关的知识,希望对你有一定的参考价值。

参考技术A 正则的效率非常低,有很多不用正则的好方法:
一,示例 某java程序
比如说一个Test2.java,将其保存在C盘根目录下,代码内容如下
/**
* @author xxx
*
*/
public class Test2
/* main method */
public static void main(String[] args)
//a
int a =5;
//b
int b =5;
//a+b
System.out.println(a+b);




二,提取注释程序,将所有注释放到一个List里面,最后打印输出:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Test
private static final String javaFilePath = "C:/Test2.java";
public static void main(String[] args) throws IOException
List<String> comments = new ArrayList<String>();
BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(javaFilePath)));
String line=null;
while((line=bfr.readLine())!=null)
line = line.trim();
if(line.startsWith("//"))
comments.add(line);

else if(line.startsWith("/*")&&line.endsWith("*/"))
comments.add(line);
else if(line.startsWith("/*")&&!line.endsWith("*/"))
StringBuffer multilineComment = new StringBuffer(line);
while((line=bfr.readLine())!=null)
line = line.trim();
multilineComment.append("\n").append(line);
if(line.endsWith("*/"))
comments.add(multilineComment.toString());
break;





bfr.close();
for(int i=0;i<comments.size();i++)
System.out.println("第"+(i+1)+"处注释: ");
System.out.println(comments.get(i));





三,输出结果:
第1处注释:
/**
* @author xxx
*
*/
第2处注释:
/* main method */
第3处注释:
//a
第4处注释:
//b
第5处注释:
//a+b

SQL 注释中的 Java 正则表达式查找/替换模式

【中文标题】SQL 注释中的 Java 正则表达式查找/替换模式【英文标题】:Java Regex find/replace pattern in SQL comments 【发布时间】:2011-12-06 22:02:51 【问题描述】:

我只想在 SQL cmets 中查找/替换字符/模式(单行 cmets -- 和块 cmets /* */)。源字符串是一个 SQL 脚本。

目前我正在 cmets 中搜索分号 (;),并希望将其替换为空格。

来源

CREATE OR REPLACE PROCEDURE TESTDBA.PROC_REUSING_BINDED_VAR_N_DSQL

 AS
        a NUMBER:=2;
        b NUMBER:=3; -- jladjfljaf; lakjflajf
-- alksdjflkjaf ladkjf 
        v_plsql_tx VARCHAR2(2000);
    begin
        v_plsql_tx := 'BEGIN ' || ' :1 := :1 + :2; ' || 'END;';
        execute immediate v_plsql_tx
        using in out a, b;
        insert into testdba.NEW_TESTING_TABLE(CHARACTER_VALUE) VALUES('a='||a);
   end PROC_REUSING_BINDED_VAR_N_DSQL;
-- lajdflajf

/*lakjdfljalfdk; alkdjf*/

/*asdf 
;
asdfa*/

/*
    adf
asd asdf


*/

你能不能给点建议。

谢谢

【问题讨论】:

【参考方案1】:

我会这样做:

    try 
    Pattern regex = Pattern.compile("(?:/\\*[^;]*?\\*/)|(?:--[^;]*?$)", Pattern.DOTALL | Pattern.MULTILINE);
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) 
        // matched text: regexMatcher.group()
        // match start: regexMatcher.start()
        // match end: regexMatcher.end()
     
 catch (PatternSyntaxException ex) 
    // Syntax error in the regular expression

以上内容将为您提供所有不带“;”的 cmets。然后我会逐行遍历 sql 文件,当我遇到有注释的行时,我会检查该行是否在我的匹配列表中 - 如果不是,那么我会搜索替换;在整个评论中带有“”。当然,您必须找到注释的结束位置,但这很容易——在同一行和 /* 以及找到第一个 */ 时结束。这样您就可以更改任意数量的 ;使用相同的代码。

【讨论】:

这详细解释了我想要什么,并提供了一个解决方案ostermiller.org/findcomment.html。但是这个解决方案有一个很大的性能问题,这里讨论***.com/questions/462843/… 这似乎会捡起像 blah blah 【参考方案2】:

你需要先搞清楚:多线cmets有两种处理方式。

    单个“*/”关闭所有当前打开的“/*”。 对于每个“/*”,您需要一个对应的“*/”(嵌套 cmets)。

第一个相对容易实现。第二个只能通过深度魔术正则表达式(阅读:未来的编码人员无法维护)或短程序来完成。

第一个很简单:只要有嵌入的分号,使用“/\*.*;.*\*/”就会给你一个匹配项。

第二个需要一些编程。如果遇到“;”,则需要检查您当前是否在评论中。您可以通过顺序读取文件(忽略回车/换行)并在遇到“/*”时增加一个数字并在遇到“*/”时减少该数字来知道。如果数字至少为 1,则分号位于注释中。

【讨论】:

【参考方案3】:

最好的办法可能是使用两个正则表达式和两个模式(一个单行和一个多行)。

单行:\\-\\-[^;]*(;) -- 不确定在一行中找到多个 ; 的最佳方法

多行:/\\*[^;(\\*/)]*?(;)[^;]*?\\*/——反正是这样的

【讨论】:

以上是关于用java正则表达式提取java程序中的注释的主要内容,如果未能解决你的问题,请参考以下文章

用java 正则表达式 提取IP地址

java 中的字符串处理--正则表达式

什么是用于查找未注释 Java 代码行的正则表达式?

Java:使用正则表达式从块注释中去除斜线和星号

用正则表达式提取网址中的IP怎样取?

java 正则表达式 提取IP