这是我的示例代码:
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结果)。
答案 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
是八进制值,详情请参阅: