regex.replace不替换此表达式中的所有内容。

时间:2012-01-13 23:06:27

标签: .net regex powershell-v2.0

[regex]::replace('test test','^(.*?)test', 'barf')

返回'barf test'

为什么不替换所有出现的'test'?这必须与后续替换迭代开始的位置有关。

4 个答案:

答案 0 :(得分:2)

快速回答:您将其锚定在输入的开头(^),并且您的第一个组((.*?))没有捕获任何内容(因为第一次出现test在行开头之后你使用了一个惰性量词 - 而且你不在替换字符串中使用捕获。如果你使用了“普通”量词,那么test的最后一次出现就会被替换掉)

长答案:正则表达式永远不需要匹配整个输入,只需要匹配必要的部分。更重要的是,当循环输入时,正则表达式引擎将从成功完成匹配的位置开始下一轮。

在这里,您要替换test的字符序列。请注意,这也意味着testosterone将匹配(或untested)。如果您想将test与“字词”匹配,请使用锚\b一词。

这是有效的(test在Powershell v2上编辑:

[regex]::replace('test test','\btest\b', 'barf')

行动中的引擎看起来像这样:

# beginning
regex: |\btest\b
input: |test test
# \b: matched,  beginning of input followed by word character
regex: \b|test\b
input: |test test
# literal matching of t, then e, then s, then t
regex: \btest|\b
input: test| test
# \b: match, word character followed by non word character
regex: \btest\b|
input: test| test
# replacement
regex: \btest\b|
input: barf| test
# beginning of second round
regex: |\btest\b
input: barf| test
# \b: match, word character followed by non word character
regex: \b|test\b
input: barf| test
# t: not matched. Failed matching. Proceeding to next character
regex: |\btest\b
input: barf |test
# \b: match
regex: \b|test\b
input: barf |test
# literal matching of t, then e, then s, then t
regex: \btest|\b
input: barf test|
# \b: match, word character followed by end of input
regex: \btest\b|
input: barf test|
# replacement
regex: \btest\b|
input: barf barf|
# beginning of next round
regex: |\btest\b
input: barf barf|
# end of input: end of processing

答案 1 :(得分:0)

这是因为.*?匹配尽可能少,包括空字符串。所以你只匹配第一个“测试”并替换它。

主要原因是你的主播^。这意味着你的正则表达式从一开始只匹配一次,在替换后正则表达式将在替换后继续,但此时锚点不正确,所以你的正则表达式已经完成。

来自您的评论

  

BUT!为什么不替换这两者:[regex] :: replace(“testntest”,'^(。*?)test','barf')(The "test ntest“中间有一个换行符,所以第二个实例应该匹配^

如果您使用修饰符^(多行),则锚m仅匹配字符串的开头,那么锚^将会匹配行的开头

如果您想要替换所有出现的“test”,那么只匹配“test”,而不是^.*?

答案 2 :(得分:0)

因为一旦在字符串的开头找到第一个'test'(/(.*?)/匹配一个空字符串),下一个搜索就会在该字符串之后开始。直接/^/无法匹配,因此不再进行替换。

正则表达式引擎找不到模式可能匹配的所有方式:它声称它遇到的第一个匹配并继续前进。

答案 3 :(得分:-1)

问号是懒惰的运算符。它试图尽快退出。删除它,你的意志将完成。