匹配多个可选的正则表达式组时,括号/括号重叠

时间:2019-04-15 13:43:25

标签: regex

我正在尝试匹配类似路径的模式,尽管在尝试重复一组时似乎遇到了麻烦。

一些我想匹配的模式:

e.g1: /s0me/p@th/2/json

e.g2: /path

到目前为止,我有这个:

(^\/[^/]*)(\/[^/]*)?

最多匹配:

/s0me/p@th

我正在尝试执行以下操作以重复第二组,但是正则表达式似乎认为我比我想要的更早/更晚了括号,从而导致错误:

(^\/[^/]*)[(\/[^/]*)?]*

错误:右括号不匹配

我为此使用https://www.regextester.com

谢谢

2 个答案:

答案 0 :(得分:0)

您有一个不匹配的括号,我想您已经将右括号放在了字符类中,然后将其按字面意义匹配了。

(^\/[^/]*)[(\/[^/]*)?]*
           ^       ^

如果要对其进行纠正(将其放置在字符类之外),将获得一个可选的捕获组,然后在末尾重复0+次]

如果仅重复第二个捕获组,则仅last iteration的结果将在该组中。

如果要获得其余结果的结果,则必须使用围绕重复模式的捕获组:

(^\/[^/\n]*)((?:/[^/\n]+)*)
  • (捕获组1
    • ^\/[^/\n]*声明字符串的开头,匹配/,后跟一个也与换行符匹配的否定字符类
  • )关闭群组
  • (捕获组2
    • (?:/[^/\n]+)*重复匹配/的0+次,然后是否定的字符类
  • )关闭群组

regex demo

答案 1 :(得分:0)

我不确定我了解你的目标是什么。我假设您要匹配POSIX路径名,然后写以下答案。由于在Linux / Unix中,文件名可以包含NUL 、:和/以外的任何字符,因此实现起来可能非常困难(或容易,具体取决于您输入的内容)。

最简单的方法是匹配不包含这些字符的每一行(/除外,因为它在路径中使用):

^[^\x00:]+$

如果我们找到任何匹配项,则表明字符串可能是文件名(或完整路径)。

然后我们可以添加一个假设,即路径名中不会出现换行符,因此我们可以将正则表达式更新为:

^[^\x00\n:]+$

有时我们只需要绝对路径,因此我们在字符串的开头匹配/:

^/[^\x00\n:]+$

您还可以添加要求,即该路径从根目录引导至少2个目录:

^(/[^\x00\n:/]*){3,}$

我们可以增加文件名的更多限制,但是您明白了。

您可能希望将每个路径段捕获到一个组中,然后可能会遇到问题,因为我们不知道会有多少个组。递归可能会实现,也可能无法实现,但是并非每个正则表达式引擎都支持。