【问题标题】:Regex replacement capture followed by digit正则表达式替换捕获后跟数字
【发布时间】:2010-08-12 10:59:34
【问题描述】:

我正在尝试使用正则表达式替换来更新我的 AssemblyInfo.cs 文件,所以我有:

Regex.Replace(
    contents, 
    @"(\[assembly: Assembly(File)?Version\("").*(""\)\])", 
    "$1" + version + "$3"
);

问题在于version 类似于"1.5.3.0",因此在评估替换时,它会看到"$11.5.3.0$3",并且可能正在寻找第十一个捕获的组,因为它会出现:

$11.5.3.0")]

如果在$1 后面加上一个空格,它可以正常工作。在不实际插入字符的情况下,我需要在其中输入什么来转义第二个数字?

【问题讨论】:

    标签: .net regex


    【解决方案1】:

    使用${1} 代替$1。这也是命名capturing group(?<name>) 的替换语法。

    这里有一个 sn-p 来说明 (see also on ideone.com):

    Console.WriteLine(Regex.Replace("abc", "(.)", "$11"));        // $11$11$11
    Console.WriteLine(Regex.Replace("abc", "(.)", "${1}1"));      // a1b1c1
    Console.WriteLine(Regex.Replace("abc", "(?<x>.)", "${x}1"));  // a1b1c1
    

    此行为已明确记录:

    Regular Expression Language Elements - Substitutions

    Substituting a Numbered Group

    $number 语言元素包含替换字符串中与number 捕获组匹配的最后一个子字符串,其中number 是捕获组的索引。

    如果number 没有指定正则表达式模式中定义的有效捕获组,$number 将被解释为一个文字字符序列,用于替换每个匹配项。

    Substituting a Named Group

    ${name} 语言元素替换了与 name 捕获组匹配的最后一个子字符串,其中 name 是由 (?&lt;name&gt;) 语言元素定义的捕获组的名称。

    如果name 未指定正则表达式模式中定义的有效命名捕获组,${name} 将被解释为用于替换每个匹配项的文字字符序列

    【讨论】:

    • 只需使用 ${1} 就可以了。谢谢!
    • $[1}1 作为编号组也适用于Powershell
    • 如何将 1 添加到整个字符串,而不是每个字符?在 powershell 中,替换每个字符并添加 1 为 write-host ($a -replace "(.)", '${1}1')。我可以在搜索参数中重复字符串,但还有其他选择吗?
    • 在 Python 中,使用 \g&lt;1&gt; 而不是 \1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多