gpt4 book ai didi

regex - 如何正则表达式模式匹配具有固定前缀的可变长度单词?

转载 作者:行者123 更新时间:2023-12-04 10:58:09 30 4
gpt4 key购买 nike

摘要

一个正则表达式如何匹配我认为可能(?)最好的描述为“带有固定前缀的可变长度单词”?

详情

下面的示例尝试删除 aa:22 .他们都没有工作。

所有命令的首选输出是 bb:33 cc:44 .当然,这些命令并非旨在删除前导或额外空格。

我聘用perl -pe (不成功,在第一个命令中)试图使可变长度模式匹配成为“非贪婪”。

在这些示例中,aa:是前缀(可以认为是键值对中的“键”)和 22是可变内容、可变长度的值;即,它可能是 aa:2vED/3rD@&x3J{ZB334}A (在此语法中,任何包含除 : 以外的非空白字符的字符串),但它总是在右侧以空白为边界(空格和制表符是唯一的空白字符,是吗?)或行尾.

此外:可以按任何顺序找到单词序列(键值对)。因此,awk -based 固定列匹配可能不起作用。

我正在寻找一个优雅、简单的解决方案。我已经阅读了许多 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。
  • 关于regex - 如何正则表达式模式匹配具有固定前缀的可变长度单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59032544/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com