在正则表达式中,如何将字符串与可选字符串匹配

时间:2016-06-22 05:03:55

标签: regex

我的正则表达式是

\/(.*)\/(((?:opt1)?)((?:\/opt2)?)((?:\/opt3))?)?\/data\/(.*)

在上面的表达式中,我认为 / opt1 / opt2 / opt3 是可选的,所有可以存在或者一两个。

我想要的输出低于字符串应该匹配

  • /main/opt1/opt2/opt3/data/a.txt
  • /main/opt1/data/b.txt
  • /main/opt2/data/c.txt
  • /main/opt2/opt3/data/d.txt
  • /main/opt3/data/e.txt
  • /main/data/ee.txt

但只有 /main/opt1/data/sample.txt 才会匹配。字符串下面也不应该匹配

  • /main/data1/f.txt
  • /main/opt1/data1/g.txt
  • /main/opt2/h.txt

这里有什么问题。感谢

2 个答案:

答案 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\/.+$