调试正则表达式

问题描述:

我正在尝试在java中为C++源文件编写注入器。这只是一个加速代码编辑过程的基本工具。调试正则表达式

我所扫描的主要是:

ClassName::FunctionName() { 

我用txt2re(http://txt2re.com)来生成我搜索一个正则表达式,等于:

.*?(?:[a-z][a-z0-9_]*).*?((?:[a-z][a-z0-9_]*))(:)(:)((?:[a-z][a-z0-9_]*))(\\().*?(\\)).*?(\\{) 

我的应用程序是用Java编写的,并在我的测试文件上工作。现在我试图扫描源代码的子目录来应用我的更改,但匹配器挂起。据说一些正则表达式没有被优化,甚至是错误的,所以它是有意义的。在正则表达式方面,我不是一个专家,也不是很坚定地使用它们(它很少发生)。有什么方法可以加快匹配过程或纠正我的模式?

您的搜索将特征提取到替换表达式中。你需要吗?我假设你这样做。我删除了你不需要的空白选项(即“:?”),并将这些分组弄平。如果你想要做的只是在确定一条匹配线后注入一些代码,它可以进一步变平。下面是一些代码,我从txt2re修改:

import java.util.regex.*; 

class Main 
{ 
    public static void main(String[] args) 
    { 
    String txt=" ClassName::function_name123(char *p) { "; 

    String re1="([a-z][a-z0-9_]*)"; // match and group class name 
    String re2="::"; // match and eat exactly :: 
    String re3="([a-z][a-z0-9_]*)"; // match and group function name 
    String re4="(\\(.*\\))"; // match and group round braces (and any parameters between them) 
    String re5="\\s*"; // match and eat whitespace 
    String re6="\\{"; // match and eat exactly { 

    Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6,Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
    Matcher m = p.matcher(txt); 
    if (m.find()) 
    { 
     String classname=m.group(1); 
     String funcname=m.group(2); 
     String params=m.group(3); 
     System.out.println("I discovered that class "+classname+" has function "+funcname+params); 
    } 
    } 
} 
+0

我想你的正则表达式,并在有问题的文件更快结束,但现在不是所有出现被发现!尽管我不知道为什么... – clambake 2014-09-11 11:14:51

+0

引用差异我的基本功能大纲看起来像这样:'void ClassName :: FunctionName(void * arg,...)\ n {'但是这不应该有所作为 – clambake 2014-09-11 11:17:19

+0

如果你想匹配的表达式超过了文件的几行,(在你的大括号之前用换行符证明),那么你需要确保你在进行正则表达式匹配之前连接这些行。否则,您将在“void ClassName :: function_name123(void * arg,...)”(它不匹配)上进行匹配,然后匹配“{”(这也不匹配)。 – 2014-09-11 11:41:03