用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程序中的注释的主要内容,如果未能解决你的问题,请参考以下文章