gpt4 book ai didi

regex - 使用 MAWK 时正则表达式与字符串不匹配

转载 作者:行者123 更新时间:2023-12-05 05:44:40 31 4
gpt4 key购买 nike

我已经定义了一个正则表达式,它匹配由一个或多个空格分隔的单词列表,其中一个单词后跟一个星号。奇怪的是,对于只有一个单词的列表,当我使用 mawk 时表达式不匹配,但当我使用 gawk 和 nawk 时它匹配:

$ echo 'a*' | mawk '/([a-z]+ *)*[a-z]+ *[*]( *[a-z]+)*/'
$ echo 'a*' | gawk '/([a-z]+ *)*[a-z]+ *[*]( *[a-z]+)*/'
a*
$ echo 'a*' | nawk '/([a-z]+ *)*[a-z]+ *[*]( *[a-z]+)*/'
a*

如果带星号的单词后跟一个或多个单词,则使用 mawk 时正则表达式也匹配:

$ echo 'a* b' | mawk '/([a-z]+ *)*[a-z]+ *[*]( *[a-z]+)*/'
a* b

有什么线索吗?

在 Debian 11 中,mawk 是 AWK 的默认实现。

$ mawk -W version
mawk 1.3.4 20200120
Copyright 2008-2019,2020, Thomas E. Dickey
Copyright 1991-1996,2014, Michael D. Brennan

random-funcs: srandom/random
regex-funcs: internal
compiled limits:
sprintf buffer 8192
maximum-integer 2147483647

最佳答案

不知道如何修复 mawk-1 本身,但如果你想让正则表达式规避它的缺点:

echo 'a*' | mawk '/([a-z]+ *)*[a-z]+ *[*](( *[a-z]+)*)?/'

a*

但是既然之前或之​​前的所有东西都只是“零或更多”,而且你无论如何都需要整行,那为什么不呢

echo 'a*' | mawk '/[a-z]+([ ]+)?[*]/' 

a*

或者更简单地说,

echo 'a*' | mawk '/[a-z] +?\*/'  

a*

如果你想要一个严格的标准,那么也许

echo 'a*' | mawk '/([a-z]+ +?)+[*]( +?[a-z]+)+?/'

a*

使用 [...]+? 而不是 [...]* 有时 可能对正则表达式引擎更友好。

大多数现代正则表达式引擎不应该对 [...]* 有任何问题,但这将是其中一种不太直观的出现语法为引擎提供有意义帮助的场景

关于regex - 使用 MAWK 时正则表达式与字符串不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71549080/

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