我有下一个正则表达式,当我在线测试时可以正常运行:http://www.regexr.com/但不适用于我的java项目:
(?:function jo|[{;]jo\s*=\s*function)\((.*?[a-z,]+)\){(.*?[^}]+)}
我的代码:
Pattern p2 = Pattern.compile("(?:function "+funcname+"|[{;]"+funcname+"\\s*=\\s*function)\\((.*?[a-z,]+)\\){(.*?[^}]+)}");
我的错误:
07-23 23:43:17.608: E/AndroidRuntime(1724): (?:function jo|[{;]jo\s*=\s*function)\((.*?[a-z,]+)\){(.*?[^}]+)}
07-23 23:43:17.608: E/AndroidRuntime(1724): ^
我的示例测试字符串:
{return a.reverse()}};function jo(a){a=a.split("");a=io.aS(a,53);a=io.Y7(a,19);a=io.aS(a,9);a=io.km(a,2);a=io.Y7(a,29);a=io.km(a,1);return a.join("")};function ko(){};var lo
我想提取这部分:
a=a.split("");a=io.aS(a,53);a=io.Y7(a,19);a=io.aS(a,9);a=io.km(a,2);a=io.Y7(a,29);a=io.km(a,1);return a.join("")
非常感谢,我对正则表达式感到疯狂。
答案 0 :(得分:1)
我只是想说使用正则表达式来解析代码并不是最好的主意。您应该搜索解析器并改为使用它。
您似乎忘记了在正则表达式结束时逃离{
和}
。你需要转义它们,因为它们是正则表达式元字符,用于指定某些内容可以显示为
a{4}
- 表示a
必须恰好出现4次a{2,4}
- 表示a
必须出现2,3或4次a{2,}
- 表示a
必须出现2次或更多次。 尝试
Pattern p2 = Pattern.compile("(?:function " + funcname + "|[{;]"
+ funcname + "\\s*=\\s*function)\\((.*?[a-z,]+)\\)\\{(.*?[^}]+)\\}");
// parts changed ^^^ ^^^
演示:
String text = "{return a.reverse()}};function jo(a){a=a.split(\"\");a=io.aS(a,53);a=io.Y7(a,19);a=io.aS(a,9);a=io.km(a,2);a=io.Y7(a,29);a=io.km(a,1);return a.join(\"\")};function ko(){};var lo";
String funcname = Pattern.quote("jo");// lets excape potential regex
// special characters
Pattern p2 = Pattern.compile("(?:function " + funcname + "|[{;]"
+ funcname + "\\s*=\\s*function)\\((.*?[a-z,]+)\\)\\{(.*?[^}]+)\\}");
Matcher m = p2.matcher(text);
while (m.find())
System.out.println(m.group(2));
输出:
a=a.split("");a=io.aS(a,53);a=io.Y7(a,19);a=io.aS(a,9);a=io.km(a,2);a=io.Y7(a,29);a=io.km(a,1);return a.join("")