我的正则表达式是
\/(.*)\/(((?:opt1)?)((?:\/opt2)?)((?:\/opt3))?)?\/data\/(.*)
在上面的表达式中,我认为 / opt1 / opt2 / opt3 是可选的,所有可以存在或者一两个。
我想要的输出低于字符串应该匹配
但只有 /main/opt1/data/sample.txt 才会匹配。字符串下面也不应该匹配
这里有什么问题。感谢
答案 0 :(得分:3)
更简单的方法是使用
^\/[^\/]*(?:\/opt[123])*\/data\/.+$
<---->
Replace with main
if necessary
<强> Regex Demo 强>
正则表达式细分
^ #Starting of string
\/ #Match / literally
[^\/]* #Match anything except /
(?:\/opt[123])* #Match opt followed by 1, 2 or 3
\/ #Match / literally
data #Match data literally
\/ #Match / literally
.+ #From last / to end of string
$ #End of string
如果只需要0到3次出现,你也可以定义范围
^\/[^\/]*(?:\/opt[123]){0,3}\/data\/.+$
如果订单很重要,那么您可以使用
^\/main(?:\/opt1)?(?:\/opt2)?(?:\/opt3)?\/data\/.+$
<强> Regex Demo 强>
答案 1 :(得分:1)
这个简单的正则表达似乎可以解决问题,它可以很好地处理你的测试字符串:
\/main(\/opt[123])*\/data\/.+
如果您的输入字符串不包含任何其他字符,您还可以添加锚点以指定begin和end:
^\/main(\/opt[123])*\/data\/.+$