Matcher不会返回唯一结果

时间:2017-07-24 04:39:27

标签: java regex

这是我的示例代码:

public String testMethod() {
    String sampleString = "Hi <username>. Is <username> your name?. <username> rocks! <admin> wishes you well. Ask <admin> if you have any trouble!";
    String myRegex = "your regex here";

    Pattern pattern = Pattern.compile(myRegex);
    Matcher matcher = pattern.matcher(stringSample);
    int counter = 0;
    while (matcher.find()) {
        counter++;
    }

    return "Matched substring: " + counter;
}

首先,我希望获得具有此模式<([a-zA-Z0-9_]+)>的标签。当我使用该模式时,由于sampleString中有5个标记,因此得到5。这很好但我希望Matcher只返回唯一匹配。

根据示例代码中的字符串,结果为2,因为有2个唯一标记(<username><admin>)。所以我基于this answer构建我的正则表达式,现在我有这种模式<([a-zA-Z0-9_]+)>(?!.*\1)。我尝试了Regex101上的模式,它运行得很好。但是当与示例代码一起使用时,结果仍然是5。

我的模式有什么问题吗?

编辑: 就像链接的问题一样,我想避免使用地图或列表。我想强调的是,我问为什么我的正则表达式无法在Java上工作(基于Regex101结果)。

2 个答案:

答案 0 :(得分:2)

而是提出复杂的正则表达式,您可以使用简单的正则表达式<(\\w+)>并将结果存储在Set中以仅获取唯一匹配项:

String sampleString = "Hi <username>. Is <username> your name?. <username> rocks! <admin> wishes you well. Ask <admin> if you have any trouble!";
String myRegex = "<(\\w+)>";

Pattern pattern = Pattern.compile(myRegex);
Matcher matcher = pattern.matcher(sampleString);

Set<String> tags = new HashSet<>();

while (matcher.find()) {
    tags.add(matcher.group(1));
}

System.out.printf("tags: %s, count: %d%n", tags, tags.size());

<强>输出:

tags: [admin, username], count: 2

答案 1 :(得分:1)

您应该使用<([a-zA-Z0-9_]+)>(?!.*\\1)\\1 Java 代码<{1}}中的第一个捕获组

实际\1八进制值,详情请参阅:

What are all the escape characters in Java?