正则 - vim - 使用 非贪婪模式 匹配字符串
-
概述
- vim 下的正则非贪婪匹配
-
背景
- 复习 jvm 相关的内容
- 发现得出的信息, 不太友好, 于是想做 格式化
-
环境
- OS
- win10
- git-bash
- mintty-2.9.4
- OS
1. 原始文段
-
文段
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:InitialHeapSize=1073741824 -XX:+ManagementServer -XX:MaxHeapSize=17163091968 -XX:MaxNewSize=5721030656 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=357564416 -XX:OldSize=716177408 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
2. 需求
-
将输出文本格式化
- 格式要求
Non-default VM flags:
单独成行- 其余的每行, 格式如下
-XX:-BytecodeVerificationLocal
- 格式要求
-
最终成品
Non-default VM flags: -XX:-BytecodeVerificationLocal ...
3. 思路
- 使用 ex 表达式
- 使用 ex 表达式, 做替换
- 替换肯定要涉及到 正则 了
4. 尝试
预处理
- 先把
Non-default VM flags:
单独提出来- 后面的格式, 基本都一致了, 处理起来就很轻松
尝试1
-
使用 ex 命令
: s/\(-.* \)/\1\r/g
-
结果
- 发现匹配的内容, 和我预想的不太一样
- 除了 最后的那个 -XX 格式, 全都给我匹配上了
- 这个和我想的不一样啊....
- 发现匹配的内容, 和我预想的不太一样
-
思考
- 模模糊糊记得, 之前听到过一个 贪婪匹配 的说法
- 贪婪匹配
- 一次尽量匹配最多内容
- 特别是 重复, 嵌套之类的场景, 比较明显
- 非贪婪匹配
- 一次尽量匹配少的内容
- 贪婪匹配
- 模模糊糊记得, 之前听到过一个 贪婪匹配 的说法
尝试2: 引入非贪婪匹配
-
使用 ex 命令
: s/\(-.\{-} \)/\1\r/g
-
非贪婪
- .
-
这个就是对应 .* 的 非贪婪匹配
-
匹配结果
-XX:-BytecodeVerificationLocal
-
嗯, 符合预期
-
- .
-
最后一个小修饰
- 在文本的最后, 加上一个空格
- 这样就可以一下把所有行处理完成
- 在文本的最后, 加上一个空格
-
问题
- 路径
- 触发
- 变量里有 路径
- 路径里带 空格
- 注意
- 切割可能会切割下来一段 不完整的路径
- 我目前只能人工校验
- 应该还是自己太菜了吧...
- 触发
- 路径
尝试3: 另一种思路
-
使用 ex 命令
:s/\( -[A-Za-z0-9:-]*\)/\1\r/g
-
怎么说
-
失败的思路
- 这个思路粗看有效
- 但实际上, 会漏掉很多
-
区别
- 成功思路
- 重点是按照 模式, 进行分割,
- 无视了中间的内容, 减少了很多的工作量
- 失败思路,
- 没有重视 模式, 反倒集中精力在找 内容
- 但是忽略了本质
- 成功思路
-
但是这种思路, 我觉得有的时候, 应该还是能用吧...
- 如果找到了, 我会写下来
-
3. 后续
-
匹配 内容 的场景
-
同时匹配 内容 和 模式 的场景
- 能否一步到位
2, 还是说, 需要先匹配模式, 再匹配内容
- 能否一步到位
-
vim 的匹配, 还有很多内容, 后续有缘用到了再说吧
-
grep, awk, sed 相同场景, 如何处理
ps
- ref
1.VIM中正则的非贪婪匹配
1. 匹配的思路
2. vim 相关的语法
1. 好些我都不知道咋用
2. ZZ:VIM中正则的非贪婪匹配
1. 真正的原文
1. 因为 排版 和 害怕新浪微博没了, 所以有了 ref1
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出