正则表达式尝试在文本之后获取一些文本并不起作用

时间:2015-05-31 08:33:25

标签: java regex

我得到了这个代码,它应该从url。:

中检索id值
        String xmlTag = "http://www.facebook.com/profile.asp?id=123456789";
        xmlTag = xmlTag.replaceAll("/", "//");

        //regex variables
        final String regexUrl = "(?:(?:http|https):\\//\\//)?(?:www.)?facebook.com\\//(?:(?:\\w)*#!\\//)?(?:[?\\w\\-]*\\//)?(?:profile.asp\\?id=(?=\\d.*))?([\\w\\-]*)?";
        final Pattern patternUrl = Pattern.compile(regexUrl);
        final Matcher matcherUrl = patternUrl.matcher(xmlTag);  

        String urlResult = matcherUrl.group(0);         
        System.out.println("group(0) = " + urlResult);
        String regexId = "(?<=http:////www.facebook.com//profile.asp?id=).*";
        System.out.println("regexId =   " + regexId);

        final Pattern patternId = Pattern.compile(regexId);
        final Matcher matcherId = patternId.matcher(urlResult);         
        System.out.println("id = " + matcherId.matches());

输出应该是:123456789,这是&#39; true&#39;对于&atcherId.matches()&#39;

但与此相反,我得到的是“假”。那样:

Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Unknown Source)
    at MainClass.main(MainClass.java:19)

我在这里想念一下吗?

3 个答案:

答案 0 :(得分:1)

如果您的目标是从网址中找到ID,那么我建议使用更简单的正则表达式而不是使用这么长的正则表达式。

<强>示例:

{{1}}

答案 1 :(得分:0)

我试过这个:

int[] numbers = new int[names.length];
for (int i = 0; i < names.length; i++) {
    numbers[i] = i;
}

带样本

(?:(?:http|https):////)?(?:www\\.)?facebook.com//(?:(?:[\w\-]*))?(?:profile.asp\?id=(?=\d.*))?([\\w\\-]*)?


http://regexpal.com/
尝试使用它并仅逃避必要的序列
这很有用。


我知道这是针对JS的,但不应该有很多差异

答案 2 :(得分:0)

为了能够使用您需要的组,首先使您的模式遍历文本数据。您可以致电matches findlookingAt

这是必要的,因为可以有许多子串可以匹配我们的正则表达式,因此group无法知道我们想要接收哪一个。
所以我们假设我们有正则表达式a(\w),它找到两个字母,其中第一个是a,我们只想获得第二个字母。对于像abacad这样的数据,应该在匹配器上调用group()的结果是什么?它应该是b c还是d?正则表达式无法知道我们感兴趣的是哪一个,group一次只能返回一个值。因此,在我们能够使用它(或其某些部分)之前,我们的工作是使正则表达式引擎遍历并find匹配。