正则表达式消除特定字符串

时间:2013-09-09 00:45:59

标签: java regex

我有汇编代码文件。我想找出对本地子程序和库函数的所有调用。以下是文件中的一段代码:

sub_401014 proc near
call sub_401035
mov esi, ebp
add esi, offset dword_4013FC
push esi
sub ecx, 18h
add ecx, ss:dword_4015B2[ebp]
call loc_402014
xor eax, ebx
push ecx
call FindNextFileA
retn
sub_401014 endp

这里我想创建一个队列,其队列中只有2个函数名称 - > (sub_401035,FindNextFileA)。即不要添加任何对loc_的调用。

我试过这个java正则表达式,但我得到空队列:

String entry_regex = "call " + "/^((?!loc).)*$/s";
Pattern function_pattern = Pattern.compile(entry_regex); 
Matcher function_matcher = function_pattern.matcher(currentLine1); /*--> currentLine1 is current line read*/

if(function_matcher.find()){
String [] array = function_matcher.group().split(" ");
queue.insert(array[1]);
}

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你想要检索以'call'开头的所有行,并确保调用不以loc_开头,在这种情况下你的正则表达式似乎有点过分了工作。如果您使用的是Java 8,我将为您提供此解决方案:

public List<String> functions(final String code){
    return Arrays.asList(code.split("\n")).stream().filter(this::valid).map(s -> s.split(" ")[1]).collect(Collectors.toList());
}

private boolean valid(final String code){
    return code.startsWith("call") && !code.split(" ")[1].startsWith("loc_");
}

如果你没有使用Java 8,你肯定可以修改上面的代码,以便用你的JDK版本进行编译。