我想找到一个匹配URL中最长数字字符串的正则表达式。
I.e对于网址:http://stackoverflow.com/1234/questions/123456789/ask
,我希望它返回:123456789
我以为我可以使用:([\d]+)
然而,这会从左侧返回第一场比赛,而不是最长的比赛。 任何想法:)?
此正则表达式将用作策略模式的输入,从策略模式中提取某些特征:
public static String parse(String url, String RegEx) {
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(url);
if (m.find()) {
return m.group(1);
}
return null;
}
如果我可以使用单个正则表达式,那将会更加整洁。 :( -
答案 0 :(得分:0)
不要使用正则表达式。只需迭代字符:
String longest = 0;
int i = 0;
while (i < str.length()) {
while (i < str.length() && !Character.isDigit(str.charAt(i))) {
++i;
}
int start = i;
while (i < str.length() && Character.isDigit(str.charAt(i))) {
++i;
}
if (i - start > longest.length()) {
longest = str.substring(start, i);
}
}
答案 1 :(得分:0)
答案 2 :(得分:0)
纯正的Regex不可能,但我会这样做(使用Stream Max和Regex):
String url = "http://stackoverflow.com/1234/questions/123456789/ask";
Pattern biggest = Pattern.compile("/(\\d+)/");
Matcher m = biggest.matcher(url);
List<String> matches = new ArrayList<>();
while(m.find()){
matches.add(m.group(1));
}
System.out.println(matches.parallelStream().max((String a, String b) -> Integer.compare(a.length(), b.length())).get());
将打印:123456789