查找正则表达式的哪个部分导致匹配

时间:2014-01-07 15:05:50

标签: java regex

我有以下格式的正则表达式:

((.*)Venue1(.*)) | ((.*)Venue2(.*)) | ((.*)Venue3(.*))

然后我有一些推特消息并使用这个正则表达式我发现消息中是否提到了一个地点(我知道这个方法有一些错误,但此刻对我来说还不错)。然而,通过这种方式,我不知道提到了哪个地点,因为我正在使用tweet.matches(regex)。我想打破整个正则表达式并分别检查每个地址名称的推特消息。你认为有更快的方式来检查,长正则表达式的场地名称引起了比赛吗?

3 个答案:

答案 0 :(得分:4)

您可以将所有场地放在一个组中,并获得该组的价值:

.*(Venue1|Venue2|Venue3).*

在上面的正则表达式中,匹配的场地将是第一组。 (我假设您的场地只是示例,如果不是,您可以进一步简化.*(Venue[123]).*。)

之后,您可以使用Matcher#group(int)

public static void main(String[] args) throws java.lang.Exception {
    checkVenue("Test Venue1 test test");
    checkVenue("Test Venue2 test test");
    checkVenue("Test Venue3 test test");
    checkVenue("Test Venue1 Venue3 test");
}

public static void checkVenue(String tweet) {
    Pattern p = Pattern.compile(".*(Venue1|Venue2|Venue3).*");
    Matcher m = p.matcher(tweet);
    System.out.print(tweet + ":\t ");
    if (m.find()) {
        System.out.println("found " + m.group(1));
    } else {
        System.out.println("found none.");
    }
}

输出:

Test Venue1 test test:   found Venue1
Test Venue2 test test:   found Venue2
Test Venue3 test test:   found Venue3
Test Venue1 Venue3 test:     found Venue3

<强> Run this demo online here

答案 1 :(得分:2)

使用(.*)Venue([123])(.*),然后检查第二对括号之间的内容。

答案 2 :(得分:0)

您可以使用群组。 this的某些内容可能会解决旅游问题。 Vogella也有一些例子。谷歌搜索“java正则表达组”将给你很多参考:)