正则表达式:捕获组匹配应排除的字符

时间:2016-01-04 03:36:22

标签: .net regex

我在使用正则表达式解决方案时遇到问题,我认为我的解决方案是正确的,但匹配并不像我期望的那样。

有人可以帮我理解我的想法出错吗?

这是我正在解决的问题,我的正则表达式以及出了什么问题:

要解决的问题

我获得了一系列代表文件夹的字符串,例如:

"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\"

我认为第一组不应该被捕获,因为我要求最后反斜杠之前的字符不包括反斜杠。

显然,我的期望和理解是错误的。我应该在这做什么,我的理解怎么错?

1 个答案:

答案 0 :(得分:1)

好像你想要一个lazy match。删除外部捕获组,然后在表达式末尾添加?量词,以便+不再是greedy。这将允许按预期捕获每个子字符串。

/([^\\]+\\)+?/g

TopLevel\Parent\Child的输入将返回:

TopLevel\
Parent\

Updated Example

然后,您可以将/([^\\]+\\)+?/g替换为..\\

输入TopLevelFolder\Parent\Child会输出:..\..\Child

同样,TopLevelFolder\Parent会输出..\Parent