【问题标题】:Java pattern expression to exclude a special string用于排除特殊字符串的 Java 模式表达式
【发布时间】:2013-08-20 06:04:08
【问题描述】:

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

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 路径。

那么任何人都可以帮助我编写高性能的正则表达式吗?

【问题讨论】:

  • 请举例说明不应该匹配的内容。它将帮助我们制定答案
  • 您的正则表达式必须以^ 开头并以$ 结尾。这要求说字符串必须以...开头并以...结尾;否则它将匹配字符串中的任何位置
  • 嗨,波西米亚人,我想从源代码中转义 ".." 和 "'" , "\"" 。
  • 所有,我编辑我的要求,谢谢,继续。
  • 你的字符串 content3 和它想要的输出相矛盾。请对其中任何一个进行修改。

标签: java regex


【解决方案1】:

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

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

现在可以了。

【讨论】:

    【解决方案2】:

    我不确定单个正则表达式解决方案,但您可以通过 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]+)*)(?=[\"']?\\)$)"
    

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

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

    【讨论】:

    • 嗨,我想匹配这样的样本,我想精确提取如下: regex = "^[.]*url\\:\([\"\\'][(?: \\.\\.)?]([^\"\)]+)[\"\\']\)$";
    • 嗨,布莱克,是的,您的解决方案将是另一个很好的模式表达,更多地用作另一种需求。它实际上对如何简化设计和实现有很大启发。谢谢。
    • 感谢您的赞赏。使用单个正则表达式的主要问题是肯定的后向断言不允许可变长度表达式(使用 * 或 +)。
    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多