我在使用正则表达式解决方案时遇到问题,我认为我的解决方案是正确的,但匹配并不像我期望的那样。
有人可以帮我理解我的想法出错吗?
这是我正在解决的问题,我的正则表达式以及出了什么问题:
要解决的问题
我获得了一系列代表文件夹的字符串,例如:
"TopLevelFolder"
"TopLevelFolder\Parent"
"TopLevelFolder\Parent\Child"
我的目标是将这些字符串转换为以下字符串,以便在选择列表中显示:
"TopLevelFolder"
"...\Parent"
"...\...\Child"
我的正则表达式
引擎:Dot Net
语言:C#
(([^\\]+\\)+)
regex101示例:
https://regex101.com/r/zY1oM5/1
这个正则表达式试图:一次或多次,找到一个或多个不反斜杠的字符,然后是反斜杠,并将该匹配放在捕获组中。
例如,在" TopLevel \ Parent \ Child"中,将每个" TopLevel \"和"父母\"在捕获组中。
出错了什么
此示例中此正则表达式的返回捕获组包括:
"TopLevel\Parent\"
"Parent\"
我认为第一组不应该被捕获,因为我要求最后反斜杠之前的字符不包括反斜杠。
显然,我的期望和理解是错误的。我应该在这做什么,我的理解怎么错?
答案 0 :(得分:1)
好像你想要一个lazy match。删除外部捕获组,然后在表达式末尾添加?
量词,以便+
不再是greedy。这将允许按预期捕获每个子字符串。
/([^\\]+\\)+?/g
TopLevel\Parent\Child
的输入将返回:
TopLevel\
Parent\
然后,您可以将/([^\\]+\\)+?/g
替换为..\\
。
输入TopLevelFolder\Parent\Child
会输出:..\..\Child
。
同样,TopLevelFolder\Parent
会输出..\Parent
。