如何匹配另一个文本中间的模式?

时间:2014-07-03 12:56:28

标签: java regex string

我想使用java regex从给定的URL中获取一个数字。

问题是模式应该出现在URL的中间。

如何修复我的正则表达式?

Pattern p = Pattern.compile("[.w]*/pins/[.d]+/edit");
Matcher m = p.matcher("https://mysite.com/providers/271/pins/4997/edit");
while (m.find()) {
    String id = m.group();
}

3 个答案:

答案 0 :(得分:2)

如果您希望匹配4997并且Pattern没有限制来验证URL(无论如何都不应该使用正则表达式),那么你可以使用基于" lookarounds"的简单解决方案:

String url = "https://mysite.com/providers/271/pins/4997/edit";
//                           | preceded by "pins/"
//                           |         | 1 or more digits 
//                           |         |   | followed by "/edit"
Pattern p = Pattern.compile("(?<=pins/)\\d+(?=/edit)");
Matcher m = p.matcher(url);
if (m.find()) {
    //                   | whole group will only capture "\\d+"
    System.out.println(m.group());
}

<强>输出

4997

答案 1 :(得分:1)

如果要捕获引脚之间的数字并编辑,请尝试以下正则表达式

(?<=pins\/)(\d+)(?=\/edit)

DEMO

Java正则表达式,

"(?<=pins\\/)(\\d+)(?=\\/edit)"

您的Java代码将是,

String s = "https://mysite.com/providers/271/pins/4997/edit";
Pattern p = Pattern.compile("(?<=pins/)(\\d+)(?=/edit)");
Matcher m = p.matcher(s);
while (m.find()) {
          System.out.println(m.group(1));
        }

输出:

4997

Ideone

答案 2 :(得分:1)

尝试使用正则表达式模式中的微小更改pins/(\d+)/edit$

此处$表示行的结尾,括号()用于对pinsedit内匹配的数字进行分组。

示例代码:

Pattern p = Pattern.compile("pins/(\\d+)/edit$");
Matcher m = p.matcher("https://mysite.com/providers/271/pins/4997/edit");
if (m.find()) {
    String id = m.group(1);
    System.out.println(id); // 4997
}

您也可以使用String#split()方法。

示例代码:

String str = "https://mysite.com/providers/271/pins/4997/edit";
String[] arr = str.split("/");
System.out.println(arr[arr.length - 2]); // 4997