我有以下2个网址:
https://docs.google.com/a/abc.com/file/d/0Aj9Oa8x5fqsL678FNhOUF0ZEN5b25iVVZNdjdUQm9mM1E/edit
我正在使用以下正则表达式:
Pattern.compile(".*key=|/d/(.[^&/])")
因此我希望matcher.group()
返回两个网址fileId(0Aj9Oa8x5fqsL678FNhOUF0ZEN5b25iVVZNdjdUQm9mM1E)
部分,matcher.group(1)
返回fileId。
但我没有得到这些结果。
答案 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\/?\/(.*)\/.*