作为序言,我是正则表达式的初学者。我有一个看起来像这样的字符串:
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
This RegEx可能会帮助您找到您可能正在寻找的独特字符串:
/(\w+\/\w+\.xml)(?![\s\S]*\1)/s
如果你只想匹配my_folder
,你可以尝试this:
/(\my_folder\/\w+\.xml)(?![\s\S]*\1)/s
为了获得独特的字符串,你可以使用负向前瞻(?=
来断言右边的内容不是你在第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)";