regex - 替换参数剥离它不应该的空间
问题描述
我对以下替换语句确实有理解问题。
'Select {0}' -replace '[^\\](\{0\})', 'Success'
我希望:选择成功
相反,结果是:SelectSuccess
该'[^\\](\{0\})'
模式可以通过以下方式解构:
- 匹配列表中的单个字符 '\'
- 匹配里面的模式并捕获它的匹配
- 从字面上匹配字符“{”
- 从字面上匹配字符“0”
- 从字面上匹配字符'}'
如果我删除Not部分[^\\]
。然后结果再次变为选择成功
我错过了什么吗?
解决方案
正如LotPings在评论中指出的那样,问题在于[^\\]
匹配之前的空格字符{0}
,因此被替换的完整匹配是 {0}
,这就解释了为什么结果是SelectSuccess
。
解决方案是使用否定的后视断言:
Select {0}' -replace '(?<!\\)\{0\}', 'Success'
(?<!\\)
确保子表达式\{0\}
不是 ( !
) 前面有 ( (?<...
) 一个\
字符。( \\
)不包括该字符。在比赛中。
正如 LotPings 还指出的那样,您(...)
在正则表达式中使用捕获组 ( ) 没有任何效果,因为您既没有将其称为正则表达式 ( \1
) 本身内部的反向引用,也没有在替换操作数 ( $1
) 中引用它。
请注意,无论捕获组如何,它-replace
总是替换正则表达式整体捕获的内容。要匹配部分输入而不将它们包含在捕获的结果中,请使用环视断言,如上所示。
推荐阅读
- java - java 9及更高版本是否仍然独立于平台?
- javascript - 从网站获取数据并将其放在谷歌电子表格中
- c++ - 给定具有 O(1) 额外内存的已排序向量,就地删除重复元素
- javascript - 如何检查一个json对象数组中的id是否存在于另一个嵌套的json对象数组中?
- flask - 即使在发布请求后重新加载,我怎样才能保持输入?
- ios - 如何使警报具有正确的单词?
- vuetify.js - Vuetify 中的自动对焦和键盘导航
- python - AttributeError:“WebDriver”对象没有带有 send_keys 的属性“send_keys”
- jquery - 试图通过 onclick 使屏幕向下滚动,我做错了什么?
- c# - 集合可以在不提供 Type 的情况下使用泛型吗