regex - 如何正则表达式匹配具有固定前缀的可变长度单词?
问题描述
概括
一个正则表达式模式如何匹配我认为可能(?)最好描述为“具有固定前缀的可变长度单词”?
细节
下面的示例尝试删除aa:22
. 它们都不起作用。
所有命令的首选输出是bb:33 cc:44
. 当然,这些命令并非旨在删除前导或额外的空格。
我使用perl -pe
(在第一个命令中未成功)尝试使可变长度模式匹配成为“非贪婪”。
在这些示例中,aa:
是前缀(可以认为是键值对中的“键”),22
是可变内容、可变长度值;即,它可以是aa:2vED/3rD@&x3J{ZB334}A
(在这种语法中,任何包含除 a 以外的非空白字符的字符串:
),但它总是以空白为边界(空格和制表符是唯一的空白字符,是吗?)或结束-线。
进一步:可以以任何顺序找到单词序列(键值对)。因此,awk
基于 - 的固定列匹配可能不起作用。
我正在寻找一个优雅、简单的解决方案。我已经阅读了许多 Stack Overflow 的答案,它们的正则表达式看起来非常冗长和复杂,以至于难以理解。显然,我没有受过足够的正则表达式教育。
sed、perl、awk、grep 或任何其他面向 POSIX 的解决方案都是可以接受的,只要该解决方案与基线 macOS 和 Linux 兼容。
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:.*\b||'
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:.*?\b||'
22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:\B*\b||'
22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa\B*\b||'
:22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:(?!.*)\b||'
aa:22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:(?!.*)*\b||'
22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:.*^(?!.*)||'
aa:22 bb:33 cc:44
$
$ echo 'reordering...'
reordering...
$
$ echo 'bb:33 aa:22 cc:44' | perl -pe 's|aa\B*\b||'
bb:33 :22 cc:44
$
$
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G1012
$
解决方案
$ echo 'aa:22 bb:33 cc:44' | sed -E 's/aa:[^[:space:]:]*([[:space:]]|$)//'
bb:33 cc:44
$ echo 'bb:33 aa:22 cc:44' | sed -E 's/aa:[^[:space:]:]*([[:space:]]|$)//'
bb:33 cc:44
$ echo 'bb:33 cc:44 aa:22' | sed -E 's/aa:[^[:space:]:]*([[:space:]]|$)//'
bb:33 cc:44
-E
用于 ERE 支持,[^[:space:]:]*
匹配 0+ 除 wspace 和冒号以外的任何字符,- 并
([[:space:]]|$)
匹配边界 wspace 或 EOL。
推荐阅读
- python - 将 python 部署到 Heroku - Web 进程无法绑定到 $PORT
- string - VBScript 如何在字符串中包含括号
- python - 如何为使用多处理的函数设置超时?
- apache-kafka-streams - 是否可以从 Kafka 集群流式传输并发送到 Azure 事件中心
- java - 如何在 Android 中添加抽屉菜单?
- c# - 使用正则表达式格式化字符串
- numpy - numpy - 最小子数组
- powershell - import-csv 和 foreach 的问题
- dns - 当底层域发生变化时,如何使用 Intersphinx 链接文档?
- jquery - 在图像加载时保持滚动位置