Java正则表达式匹配这些字符串

时间:2014-03-28 11:00:41

标签: java regex

我有以下2个网址:

https://docs.google.com/a/abc.com/spreadsheet/ccc?key=0Aj9Oa8x5fqsL678FNhOUF0ZEN5b25iVVZNdjdUQm9mM1E&usp=drive_web#gid=0

https://docs.google.com/a/abc.com/file/d/0Aj9Oa8x5fqsL678FNhOUF0ZEN5b25iVVZNdjdUQm9mM1E/edit

我正在使用以下正则表达式:

Pattern.compile(".*key=|/d/(.[^&/])")

因此我希望matcher.group()返回两个网址fileId(0Aj9Oa8x5fqsL678FNhOUF0ZEN5b25iVVZNdjdUQm9mM1E)部分,matcher.group(1)返回fileId。

但我没有得到这些结果。

3 个答案:

答案 0 :(得分:1)

如果您 需要使用正则表达式,请使用URI

private static final Pattern PARAM_SEPARATOR = Pattern.compile("&");
private static final Pattern PATH_MATCHER = Pattern.compile("/file/d/([^/]+)");

// In query parameter...
public static String getKeyQueryParamFromURI(final String input)
{
    final URI uri = URI.create(input);
    final String params = uri.getQuery();
    if (params == null)
        return null;
    for (final String param: PARAM_SEPARATOR.split(input))
        if (param.startsWith("key="))
            return param.substring(4);
    return null;
}

// In path...
public static String getPathMatcherFromURI(final String input)
{
    final URI uri = URI.create(input);
    final String path = uri.getPath();
    if (path == null)
        return null;
    final Matcher m = PATH_MATCHER.matcher(input);
    return m.find() ? m.group(1) : null;
}

请注意,与正则表达式不同,您将收到 unescaped 的结果。例如,如果URI显示为key=a%20b,则会返回" a b"!

如果您坚持使用正则表达式(为什么?),请为查询参数执行此操作:

private static final Pattern PATTERN = Pattern.compile("(?<=[?&])key=([^&]+)");

public static String getKeyQueryParamFromURI(final String input)
{
    final Matcher m = PATTERN.matcher(input);
    return m.find() ? m.group(1) : null;
}

但是你必须自己去除参数值...

答案 1 :(得分:1)

你成为正则表达式中的优先规则的牺牲品,忘记了你的角色类的重复说明符。尝试

Pattern.compile("(key=|/d/)([^&/]+)")

您的结果将在$2

答案 2 :(得分:0)

两个不同的正则表达式模式更喜欢拆分正则表达式而不使用|(OR)。 使用不同的模式,您将获得所需的第一个捕获组。

<强>样式1:

.*key=(.*)=.*

<强> PATTERN2:

.*\/file\/?\/(.*)\/.*