1

全部,源内容可能是这样的:

String content1 = "url:(\"../../aaa/bbb/ccc\")";
String content2 = "url:('/bb/add/www')";
String content3 = "url:(ggg/eee/xxx)";
String content4 = "url:('../../aaa/bbb/ccc')";

谁能帮我设计一个高性能的 Java 模式匹配器正则表达式,如下所示:

regex = "^[.]*url\\:\\([\"\\'][(?:\\.\\.)?]([^\"\\)]+)[\"\\']\\)$";

public static String parsePath(String content,String regex) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(content);
    if (matcher.find()) {
        return  matcher.group(1);
    }
    return null;
}

我想要 content1 到 content 4 的输入,调用 parsePath 函数将始终返回 /aaa/bbb/ccc 、 /bb/add/www 、 ggg/eee/xxx 、 /aaa/bbb/ccc 。那就是我想跳过前缀("|'..和后缀'|"),只想捕捉以 / 开头的中间实际 url 路径。

那么谁能帮助我编写高性能的正则表达式?

4

2 回答 2

0

我不确定单个正则表达式解决方案,但您可以通过 2 倍方法实现相同的目标:

public static String parsePath(String content, String regex) {
    content = content.replaceFirst("^url\\:\\([\"']?([.]{2})?(/[.]{2})*", "");
    // rest is same as previous
    // .......................
}

然后在 Matcher 中使用以下内容:

  regex = "(^([a-z]+)?(/?[a-z]+)*)(?=[\"']?\\)$)"

您可以将正则表达式放在方法本身中,而不是将其作为参数传递。并根据您的需要更新字符类([az])。

注意:上述解决方案不会匹配字符串,如"url:(\"../../aaa/bbb/ccc\")""url:(\"../../aaa /bbb/ccc\")""url:(\"..///")"根本没有由您在问题和评论中显示的正则表达式处理。

于 2013-08-20T06:30:46.553 回答
0

最后,我尝试了很多次,并通过设计如下模式表达式使其工作:

regex = "url\\([\"\\'][(?:\\.\\.)]*([^\"\\)]+)[\"\\']\\)";

现在它起作用了。

于 2013-08-20T07:05:10.753 回答