首页 文章

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

提问于
浏览
1

我正在使用正则表达式解决方案,我相信我的解决方案是正确的,但匹配并不像我期望的那样 .

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

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

Problem To Solve

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

"TopLevelFolder"
"TopLevelFolder\Parent"
"TopLevelFolder\Parent\Child"

我的目标是将这些转换为以下字符串,以便在选择列表中显示:

"TopLevelFolder"
"...\Parent"
"...\...\Child"

My Regex

引擎:Dot Net

语言:C#

(([^\\]+\\)+)

regex101示例:

https://regex101.com/r/zY1oM5/1

这个正则表达式试图:一次或多次,找到一个或多个不是反斜杠的字符,然后是反斜杠,并将该匹配放在捕获组中 .

例如,在“TopLevel \ Parent \ Child”中,将“TopLevel”和“Parent \”中的每一个放入捕获组中 .

What's Going Wrong

此示例中此正则表达式的返回捕获组包括:

"TopLevel\Parent\"
"Parent\"

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

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

1 回答

  • 1

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

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

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

    TopLevel\
    Parent\
    

    Updated Example


    然后你可以用 ..\\ 替换 /([^\\]+\\)+?/g .

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

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

相关问题