【问题标题】:How to perform a RegEx replace only if another a separate filter is matched using .NET?仅当使用 .NET 匹配另一个单独的过滤器时,如何执行 RegEx 替换?
【发布时间】:2020-10-28 17:15:03
【问题描述】:

给定一个匹配/dir1/ 的字符串(路径),我需要用破折号替换所有空格。

例如:/dir1/path with spaces 应该变成 /dir1/path-with-spaces

这可以很容易地分两步完成...

var rgx = new Regex(@"^\/dir1\/");
var path = "/dir1/path with spaces";
if (rgx.isMatch(path))
{
    path = (new Regex(@" |\%20")).Replace(path, "-");
}

对我来说不幸的是,该应用程序已经构建了一个简单的 RegEx 替换并且无法修改,所以我需要让 RegEx 来完成这项工作。我以为我在这里找到了答案: regex: how to replace all occurrences of a string within another string, if the original string matches some filter

并且能够创建和测试(?:\G(?!^)|^(?=\/dir1\/.*$)).*?\K( |\%20),但后来我了解到它在这个应用程序中不起作用,因为\K 是一个无法识别的转义序列(.NET 中不支持)。

我也尝试了积极的后视,但我无法让它替换所有空格(如果匹配是贪婪的,则只有最后一个空格,如果不贪婪,则只有第一个空格)。我可以进行足够的检查来处理最大数量的空格,但是一旦我检查了 10 个空格,就会有人通过一个有 11 个空格的路径。

对于这个问题,是否有一个仅适用于 .NET 引擎的 RegEx 解决方案?

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    您可以在 .NET 中利用无限宽度的lookbehind 模式:

    Regex.Replace(path, @"(?<=^/dir1/.*?)(?: |%20)", "-")
    

    regex demo

    正则表达式详细信息

    • (?&lt;=^/dir1/.*?) - 一个正向的向后查找,匹配紧接在 /dir1/ 前面的位置,然后是除换行符之外的任何零个或多个字符,尽可能少
    • (?: |%20) - 空格或 %20 子字符串。

    【讨论】:

    • 效果很好,谢谢。我应该一直在使用 .NET 测试仪,我可能偶然发现了这个解决方案。但是,对于我的教育,为什么.*? 中的??另外,为什么(?: |%20) 而不仅仅是( |%20)
    • @thadmiller (?:...) 是一个非捕获组,因为你不需要组的值,所以不需要捕获值。我出于习惯使用.*?.* 在这里的工作方式类似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多