我想替换它:
Tata: 012345
Toto: 3421
Titi: 12345678
要
Tata: 01 23 45
Toto: 34 21
Titi: 12 34 56 78
我用:
(?!^)\ G | \ G变\ d {2}
但它不匹配
由于
编辑:谢谢,但我的问题是关于\ G断言..
答案 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}