我不知道如何在java中使用这个正则表达式

时间:2014-07-23 21:53:53

标签: java android regex

我有下一个正则表达式,当我在线测试时可以正常运行: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("")

非常感谢,我对正则表达式感到疯狂。

1 个答案:

答案 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("")