gpt4 book ai didi

.net - .net Regex.Replace中的错误?

转载 作者:行者123 更新时间:2023-12-04 03:01:04 25 4
gpt4 key购买 nike

以下代码...

using System;
using System.Text.RegularExpressions;

public class Program
{
public static void Main()
{
var r = new Regex("(.*)");
var c = "XYZ";
var uc = r.Replace(c, "A $1 B");

Console.WriteLine(uc);
}
}

.Net Fiddle Link

产生以下输出...

A XYZ BA B



您认为这是正确的吗?

输出不应该是...

A XYZ B



我想我在这里做一些愚蠢的事情。您可以提供任何帮助,以帮助我了解此问题。

这是一些有趣的事情...
using System;
using System.Text.RegularExpressions;

public class Program
{
public static void Main()
{
var r = new Regex("(.*)");
var c = "XYZ";
var uc = r.Replace(c, "$1");

Console.WriteLine(uc);
}
}

.Net Fiddle

输出...

XYZ

最佳答案

至于引擎为什么返回2个匹配的原因,是由于.NET(也是Perl和Java)处理全局匹配的方式所致,即在输入字符串中找到给定模式的所有匹配项。

该过程可以描述如下(除非指定,否则通常在搜索开始时将当前索引设置为0):

  • 从当前索引执行搜索。
  • 如果没有匹配项:
  • 如果当前索引已经指向字符串的末尾(当前索引> = string.length),则返回到目前为止的结果。
  • 将当前索引增加1,转到步骤1。
  • 如果主匹配项($0)是非空的(至少消耗了一个字符),请添加结果并将当前索引设置为主匹配项的末尾($0)。然后转到步骤1。
  • 如果主匹配项($0)为空:
  • 如果上一个匹配项非空,则添加结果并转到步骤1。
  • 如果上一个匹配为空,请回溯并继续搜索。
  • 如果回溯尝试发现非空匹配项,请添加结果,将当前索引设置为匹配项的末尾,然后转到步骤1。
  • 否则,将当前索引增加1。转到步骤1。

  • 引擎需要检查是否为空匹配;否则,它将以无限循环结束。设计人员认识到空匹配的用法(例如,将字符串拆分为字符),因此必须设计引擎,以避免永远卡在特定位置。

    此过程说明了为什么末尾有空匹配:由于在 (.*)匹配 abc之后在字符串的末尾(索引3)进行搜索,并且 (.*)可以匹配空字符串,因此找到了空匹配。并且引擎不会产生无限数量的空匹配,因为最后已经找到了空匹配。
     a b c
    ^ ^ ^ ^
    0 1 2 3

    第一场比赛:
     a b c
    ^ ^
    0-----3

    第二场比赛:
     a b c
    ^
    3

    使用上面的全局匹配算法,最多只能有2个从同一索引开始的匹配,并且仅当第一个是空匹配时才会发生这种情况。

    请注意,如果主匹配项为空,则JavaScript会简单地将当前索引加1,因此每个索引最多有1个匹配项。但是,在这种情况下 (.*),如果您使用全局标志 g进行全局匹配,则会发生相同的结果:

    (以下结果来自Firefox,请注意 g标志)
    > "XYZ".replace(/(.*)/g, "A $1 B")
    "A XYZ BA B"

    关于.net - .net Regex.Replace中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21334651/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com