我正在尝试匹配类似路径的模式,尽管在尝试重复一组时似乎遇到了麻烦。
一些我想匹配的模式:
e.g1: /s0me/p@th/2/json
e.g2: /path
到目前为止,我有这个:
(^\/[^/]*)(\/[^/]*)?
最多匹配:
/s0me/p@th
我正在尝试执行以下操作以重复第二组,但是正则表达式似乎认为我比我想要的更早/更晚了括号,从而导致错误:
(^\/[^/]*)[(\/[^/]*)?]*
错误:右括号不匹配
我为此使用https://www.regextester.com。
谢谢
答案 0 :(得分:0)
您有一个不匹配的括号,我想您已经将右括号放在了字符类中,然后将其按字面意义匹配了。
(^\/[^/]*)[(\/[^/]*)?]*
^ ^
如果要对其进行纠正(将其放置在字符类之外),将获得一个可选的捕获组,然后在末尾重复0+次]
。
如果仅重复第二个捕获组,则仅last iteration的结果将在该组中。
如果要获得其余结果的结果,则必须使用围绕重复模式的捕获组:
(^\/[^/\n]*)((?:/[^/\n]+)*)
(
捕获组1
^\/[^/\n]*
声明字符串的开头,匹配/
,后跟一个也与换行符匹配的否定字符类)
关闭群组(
捕获组2
(?:/[^/\n]+)*
重复匹配/
的0+次,然后是否定的字符类)
关闭群组答案 1 :(得分:0)
我不确定我了解你的目标是什么。我假设您要匹配POSIX路径名,然后写以下答案。由于在Linux / Unix中,文件名可以包含NUL 、:和/以外的任何字符,因此实现起来可能非常困难(或容易,具体取决于您输入的内容)。
最简单的方法是匹配不包含这些字符的每一行(/除外,因为它在路径中使用):
^[^\x00:]+$
如果我们找到任何匹配项,则表明字符串可能是文件名(或完整路径)。
然后我们可以添加一个假设,即路径名中不会出现换行符,因此我们可以将正则表达式更新为:
^[^\x00\n:]+$
有时我们只需要绝对路径,因此我们在字符串的开头匹配/:
^/[^\x00\n:]+$
您还可以添加要求,即该路径从根目录引导至少2个目录:
^(/[^\x00\n:/]*){3,}$
我们可以增加文件名的更多限制,但是您明白了。
您可能希望将每个路径段捕获到一个组中,然后可能会遇到问题,因为我们不知道会有多少个组。递归可能会实现,也可能无法实现,但是并非每个正则表达式引擎都支持。