调试正则表达式
问题描述:
我正在尝试在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);
}
}
}
我想你的正则表达式,并在有问题的文件更快结束,但现在不是所有出现被发现!尽管我不知道为什么... – clambake 2014-09-11 11:14:51
引用差异我的基本功能大纲看起来像这样:'void ClassName :: FunctionName(void * arg,...)\ n {'但是这不应该有所作为 – clambake 2014-09-11 11:17:19
如果你想匹配的表达式超过了文件的几行,(在你的大括号之前用换行符证明),那么你需要确保你在进行正则表达式匹配之前连接这些行。否则,您将在“void ClassName :: function_name123(void * arg,...)”(它不匹配)上进行匹配,然后匹配“{”(这也不匹配)。 – 2014-09-11 11:41:03