【问题标题】:Regex replace only matching groups and ignore non-matching groups?正则表达式仅替换匹配组并忽略不匹配组?
【发布时间】:2015-11-11 10:42:34
【问题描述】:

Regex.Replace 说:

在指定的输入字符串中,替换所有匹配的字符串 具有指定替换字符串的指定正则表达式。

就我而言:

string w_name = "0x010102_default_prg_L2_E2_LDep1_LLC";
string regex_exp = @"(?:E\d)([\w\d_]+)(?:_LLC)";
w_name = Regex.Replace(w_name, regex_exp, string.Empty);

输出:

0x010102_default_prg_L2_

但我期待

0x010102_default_prg_L2_E2_LLC

为什么要替换我的不匹配组(组 1 和组 3)?我该如何解决这个问题以获得预期的输出?

Demo

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    将第一个和最后一个非捕获组转换为捕获组,以便您可以在替换部分中引用这些字符并删除不必要的第二个捕获组。

    string w_name = "0x010102_default_prg_L2_E2_LDep1_LLC";
    string regex_exp = @"(E\d)[\w\d_]+(_LLC)";
    w_name = Regex.Replace(w_name, regex_exp, "$1$2");
    

    DEMO

    string regex_exp = @"(?<=E\d)[\w\d_]+(?=_LLC)";
    w_name = Regex.Replace(w_name, regex_exp, string.Empty);
    

    【讨论】:

    • 这有效:请修复组选择从“$1$2”到“$1$3”。你能解释一下它是如何工作的吗?如果我需要用说字符串“abc”而不是空字符串替换怎么办?
    • @greenfeet 为什么我需要将$1$2 更改为$1$3,因为我删除了您的正则表达式中存在的第二个上限组。 2. 只需在$1$2 之间加上abc,即$1abc$2。对于第二个答案,只需 "abc" 而不是 string.Empty 就足够了。
    • 你说得对,我没注意到你删除了第二组,谢谢!
    猜你喜欢
    • 2022-08-10
    • 2016-10-20
    • 1970-01-01
    • 2012-11-23
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2022-01-14
    相关资源
    最近更新 更多