考虑字符串"AB 1 BA 2 AB 3 BA".我怎么能之间的内容相匹配"AB",并"BA"在非贪婪的方式(在AWK)?
我尝试过以下方法:
awk '
BEGIN {
str="AB 1 BA 2 AB 3 BA"
regex="AB([^B][^A]|B[^A]|[^B]A)*BA"
if (match(str,regex))
print substr(str,RSTART,RLENGTH)
}'
Run Code Online (Sandbox Code Playgroud)
没有输出.我相信不匹配的原因是"AB"和之间有一个奇数个字符"BA".如果我str用"AB 11 BA 22 AB 33 BA"正则表达式替换似乎工作..
合并您的两个否定字符类并[^A]从第二个替换中删除:
regex = "AB([^AB]|B|[^B]A)*BA"
Run Code Online (Sandbox Code Playgroud)
但是这个正则表达式在字符串上失败了ABABA- 不确定这是不是问题.
说明:
AB # Match AB
( # Group 1 (could also be non-capturing)
[^AB] # Match any character except A or B
| # or
B # Match B
| # or
[^B]A # Match any character except B, then A
)* # Repeat as needed
BA # Match BA
Run Code Online (Sandbox Code Playgroud)
由于A在交替中匹配一个字符的唯一方法是匹配除B之前的字符,我们可以安全地使用simple B作为替代方案之一.
另一个答案并没有真正回答:如何非贪婪地匹配?\n看起来它无法在 (G)AWK 中完成。手册是这样说的:
\n\n\n\n\nawk(和 POSIX)正则表达式始终匹配可匹配的输入字符的最左边、最长\n 序列。
\n
https://www.gnu.org/software/gawk/manual/gawk.html#Leftmost-Longest
\n\n并且整个手册中没有包含“贪婪”或“懒惰”这样的词。它提到了扩展正则表达式,但是对于贪婪匹配,您需要 Perl 兼容的正则表达式。所以\xe2\x80\xa6 不,无法完成。
\n