给出以下字符串:
/folder/subfolder/all
/folder/subfolder/all?a=b
/folder/anothersubfolder/all?a=b
/folder/all
/folder/all?a=b
/folder/anothersubfolder
/folder/anothersubfolder/all
/folder
子文件夹" all"是预定义的,需要从字符串中可能存在或不存在的任何其他子文件夹中单独提取。
像
这样的正则表达式^\/(folder)(\/[^/?]*)?(\/[^/?]*)?(\?.*)?$
对我不起作用。应修复包含不同文件夹的组。有了这个正则表达式,子文件夹" all"是第2组或第3组。
正则表达式的结果应该是这样的:
答案 0 :(得分:1)
^\/(folder)((?:\/(?!all)[^/?]*)?)((?:\/all)?)((?:\?.*)?)$
[["folder", "/subfolder", "/all", "" ],
["folder", "/subfolder", "/all", "?a=b"],
["folder", "/anothersubfolder", "/all", "?a=b"],
["folder", "", "/all", "" ],
["folder", "", "/all", "?a=b"],
["folder", "/anothersubfolder", "", "" ],
["folder", "/anothersubfolder", "/all", "" ],
["folder", "", "", "" ]]
这里有两个主要技巧:
非捕获组?:
,它告诉正则表达式引擎不要保持匹配,但仍然使用它来将正则表达式部分聚集在一起。它允许我们执行((?:stuff)?)
之类的操作,这会创建一个可以为空的强制组。
否定前瞻?!
,告诉正则表达式与某个模式不匹配。所以在这种情况下(?!all)
表示“all”不能在第二个目录块中。 (注意:这意味着第二个目录不能以“all”开头)