正则表达式:如何使用\ G用这个替换

时间:2014-06-01 12:21:42

标签: .net regex

我想替换它:

Tata: 012345
Toto: 3421
Titi: 12345678

Tata: 01 23 45
Toto: 34 21
Titi: 12 34 56 78

我用:

(?!^)

\ G | \ G变\ d {2}

但它不匹配

由于

编辑:谢谢,但我的问题是关于\ G断言..

3 个答案:

答案 0 :(得分:2)

试试这个

var subject = "Tata: 012345";
var result = Regex.Replace(subject,@"\d{2}","$0 ");

修改:至于您的\G无效的原因? \G检查最后一个匹配位置,它应该在那里开始下一个匹配。所以最初没有匹配,它会检查是否可以在索引0中进行任何匹配,在这种情况下不可以。这就是它失败的原因。

我不确定这种模式(?!^)\G|\G\d{2}是什么意思。如果您的模式为\G\d{2}且您的主题只有数字,那么它就会有效。

示例:

var subject = "012345";
var result = Regex.Replace(subject,@"\G\d{2}","$0 ");

将导致01 23 45

答案 1 :(得分:2)

您根本不需要使用\G功能。如果有几个连续的数字,正则表达式引擎将找到它们而不检查它们是否是连续的。

您可以使用此替代品:

Regex.Replace(txt, @"[0-9]{2}(?=[0-9])", "$0 ");

前瞻用于检查2位数字后面是否有数字,这样可以避免添加尾随空格。

如何使用\G功能:

\G是一个锚点,用于描述字符串位置的开头或最后一个匹配结束时的位置。如果您要使用\G并避免字符串的开头,则必须添加一个环视以排除字符串的开头((?!^)\G(?<!^)\G(您可以放置​​)它之后也是如此,因为\G是零宽度断言,所以它完全相同。)

(?!^)\G需要先例匹配才能成功。如果我举个例子,这个(成功的)第一场比赛的入口点可能是:(?<=: [0-9]{2})

如果没有此入口点,如果只能以(?!^)\G开头,您的模式将会失败,因为您永远不会有第一场比赛。

您获得此模式:

@"(?:(?<=: [0-9]{2})|(?!^)\G)[0-9]{1,2}"

适用于此替换" $0"

对于每一行,第一个匹配将采用第一个替代路径,所有连续匹配将采用第二个路径。

答案 2 :(得分:1)

给你一个关于\G断言的例子 看看这种模式(^\w+:\s|\G)\d{2}
它的工作原理如下:

  • ^\w+:\s首先找到^\w+:\s\d{2}
  • |然后
  • 上次比赛的
  • \G找到\G\d{2}
    Demo