Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取唯一的正则表达式匹配器结果(不使用映射或列表)_Java_Regex_Pattern Matching_Unique_Matcher - Fatal编程技术网

Java 获取唯一的正则表达式匹配器结果(不使用映射或列表)

Java 获取唯一的正则表达式匹配器结果(不使用映射或列表),java,regex,pattern-matching,unique,matcher,Java,Regex,Pattern Matching,Unique,Matcher,有没有办法只获得唯一的匹配项?在匹配后不使用列表或映射,我希望匹配器输出立即是唯一的 输入/输出示例: String input = "This is a question from [userName] about finding unique regex matches for [inputString] without using any lists or maps. -[userName]."; Pattern pattern = Pattern.compile("\\[[^\\[\\]

有没有办法只获得唯一的匹配项?在匹配后不使用列表或映射,我希望匹配器输出立即是唯一的

输入/输出示例:

String input = "This is a question from [userName] about finding unique regex matches for [inputString] without using any lists or maps. -[userName].";
Pattern pattern = Pattern.compile("\\[[^\\[\\]]*\\]");
Matcher matcher = pattern.matcher(rawText);
while (matcher.find()) {
    String tokenName = matcher.group(0);
    System.out.println(tokenName);
}
这将输出以下内容:

[userName]
[inputString]
[userName]
[userName]
[inputString]
但我希望它输出以下内容:

[userName]
[inputString]
[userName]
[userName]
[inputString]

有。您可以将反向前瞻和反向引用相结合:

"(\\[[^\\[\\]]*\\])(?!.*\\1)"
只有在字符串中不再出现与实际模式匹配的情况下,才会匹配。实际上,这意味着每次匹配都会出现最后一次,因此您会以不同的顺序获得它们:

[inputString]
[userName]
如果订单对您来说是一个问题(即,如果按照第一次出现的顺序进行订单非常重要),那么您将无法仅使用正则表达式进行此操作。您需要一个可变长度的look*behind*,而Java不支持这个功能

进一步阅读:


关于一般解决方案的一些注意事项

请注意,这将适用于匹配宽度非零的任何模式。一般的解决办法很简单:

(yourPatternHere)(?!.*\1)
(我省略了双反斜杠,因为这只适用于少数几种语言。)

如果您想让它处理具有零宽度匹配的模式(因为您只想知道一个位置,并且只出于某种原因使用lookarounds),您可以这样做:

(zeroWidthPatternHere)(?!.+\1)
另外,请注意(通常)如果输入可能包含换行符,则可能必须使用“singleline”或“dotall”选项(否则前瞻将只检查当前行)。如果您不能或不想激活它(因为您有一个包含不应与换行符匹配的句点的模式;或者因为您使用JavaScript),这是一般的解决方案:

(yourPatternHere)(?![\s\S]*\1)
为了使这个答案更广泛地适用,这里介绍了如何只匹配每个匹配的第一个匹配项(在具有可变长度lookbehind的引擎中,如.NET):


(您的模式在此)(?顺序与我的需要无关,所以这是完美的。现在我只需要对lookaheads和backreferences做一些研究,以真正理解语法。干杯!@Ibrahim我在这两个主题上添加了两个链接。有很多人试图解释这个问题……但我只在你一般解释时理解urs+1@MartinEnder谢谢你或者回复。它通过清晰的解释帮助我学习。您好,我正在Dreamweaver正则表达式搜索和浓缩咖啡中尝试您的解决方案来测试它。但它对我不起作用。我正在尝试查找datasource=“someDSNname”的所有不同实例在一个相当大的网站的源代码中。但即使在一个小示例中,如果我输入两个实例,它们都来自正则表达式。我尝试:(datasource=\“(.*?\”)(。\1)(datasource=\“(.*?\”)(.+\1)