regex - 为什么 ex (vim) 将匹配模式捕获到行尾
问题描述
文件包含以下行:
[assembly: AssemblyVersion("1.0.0.0")]
将一个版本替换为另一个版本的 Bash 脚本:
echo "%s/AssemblyVersion\s*\(.*\)/AssemblyVersion(\"$newVersionNumber\")]/g
w
q
" | ex $filePath
问题是为什么这会抓住整行到最后,所以我必须]
在替换字符串的末尾添加?
解决方案
出现问题是因为.*
将所有字符匹配到行尾,\(
并\)
创建一个捕获组(与大多数 NFA 正则表达式引擎不同,Vim 正则表达式匹配模式中未转义和未转义的(
字符)。(
)
)
您可以使用
%s/AssemblyVersion\s*([^()]*)/AssemblyVersion(\"$newVersionNumber\")/g
在这里,AssemblyVersion
将匹配单词,然后\s*
将匹配任何 0+ 空白字符,(
将匹配文字(
,[^()]*
将匹配除(
and之外的 0+ 字符)
,)
并将匹配文字)
。
您可以使用的另一个正则表达式替换命令是
:%s/AssemblyVersion\s*(\zs[^()]*\ze)/\"$newVersionNumber\"/g
在这里,AssemblyVersion\s*(
将匹配AssemblyVersion
, 0+ 个空格和(
and\zs
将从匹配中省略该部分, 然后 0+ 字符而不是(
and)
将被匹配, 然后\ze)
将检查)
当前位置的右侧是否有, 但不会添加它到比赛。
\zs
将下一个字符设置为匹配的第一个字符。模式之前的任何文本\zs
都不会包含在匹配中。
\ze
设置比赛的结束。模式之后的任何内容\zs
都不会成为匹配的一部分。
推荐阅读
- here-api - 来自这里的不正确的纽约地铁数据
- r - R 相当于 pip install -e
- c++ - 来自检测的opencv C++负X,Y坐标(yolo检测)
- c# - c#:对 KeyDown 使用 enter 不起作用
- redis - 优化 redis 中 big value 的排序集排序
- javascript - Google Chrome (build 84) 中断了 Javascript 事件 (Uncaught TypeError:timeline.toggleWatcher is not a function)
- visual-studio-code - 如何从 VSCode 扩展在配置中创建清单
- php - WooCommerce 更改产品可用性的大小和颜色
- testing - TestCafe:无法使用单步上传控件上传文件
- bing - Bing Ads API - 无法验证 - Python SDK 中的验证挑战