获取所有唯一文件名

问题描述 投票:6回答:2

作为序言,我是正则表达式的初学者。我有一个看起来像这样的字符串:

     my_folder/foo.xml::someextracontent
     my_folder/foo.xml::someextracontent
     another_folder/foo.xml::someextracontent
     my_folder/bar.xml::someextracontent
     my_folder/bar.xml::someextracontent
     my_folder/hello.xml::someextracontent

我想返回属于my_folder的唯一XML文件。所以正则表达式将返回:

my_folder/foo.xml
my_folder/bar.xml
my_folder/hello.xml

我看了一下接近我需要的Extract All Unique Lines,但我不知道从哪里去。

我得到的最接近的尝试是(?sm)(my_folder\/.*?.xml)(?=.*\1)得到所有重复,但我想要相反,所以我尝试做一个负面的前瞻而不是(?sm)(my_folder\/.*?.xml)(?!.*\1)但捕获组是完全错误的。

我的正则表达式中我在这里缺少什么?这是正则表达式的链接:https://regex101.com/r/ggY2RB/1

java regex
2个回答
1
投票

This RegEx可能会帮助您找到您可能正在寻找的独特字符串:

/(\w+\/\w+\.xml)(?![\s\S]*\1)/s

enter image description here

如果你只想匹配my_folder,你可以尝试this

 /(\my_folder\/\w+\.xml)(?![\s\S]*\1)/s

enter image description here


1
投票

为了获得独特的字符串,你可以使用负向前瞻(?=来断言右边的内容不是你在第1组中捕获的内容,而不是使用正面的前瞻(?!

在你的模式中,你使用(?s)and使用非贪婪的点开始.*?使点匹配换行,但你也可以使用匹配不是换行符或正斜杠的否定字符类。

如果文件夹也可以包含嵌套文件夹,则可以使用重复0次以上1+空格字符后跟正斜杠的模式。

(?s)(my_folder/(?:[^/\n]+/)*[^/\n]+\.xml)::(?!.*\1)
  • (?s)
  • (捕获组 my_folder/字面意思匹配 (?:[^/\n]+/)*重复0次以上不是正斜杠或换行符后跟正斜杠 [^/\n]+\.xml匹配1+或正斜杠或换行后跟.xml
  • )关闭捕获组
  • ::(?!.*\1)匹配::然后断言右边的内容不包含第1组中捕获的内容

在Java中

String regex = "(?s)(my_folder/(?:[^/\\n]+/)*[^/\\n]+\\.xml)::(?!.*\\1)";

Regex demo | Java demo

© www.soinside.com 2019 - 2024. All rights reserved.