[regex]::replace('test test','^(.*?)test', 'barf')
返回'barf test'
为什么不替换所有出现的'test'?这必须与后续替换迭代开始的位置有关。
答案 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)
问号是懒惰的运算符。它试图尽快退出。删除它,你的意志将完成。