非贪婪的正则表达式匹配awk中的多字符分隔符

Håk*_*and 3 regex awk

考虑字符串"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"正则表达式替换似乎工作..

Tim*_*ker 5

合并您的两个否定字符类并[^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作为替代方案之一.


hmi*_*ail 5

另一个答案并没有真正回答:如何非贪婪地匹配?\n看起来它无法在 (G)AWK 中完成。手册是这样说的:

\n\n
\n

awk(和 POSIX)正则表达式始终匹配可匹配的输入字符的最左边、最长\n 序列。

\n
\n\n

https://www.gnu.org/software/gawk/manual/gawk.html#Leftmost-Longest

\n\n

并且整个手册中没有包含“贪婪”或“懒惰”这样的词。它提到了扩展正则表达式,但是对于贪婪匹配,您需要 Perl 兼容的正则表达式。所以\xe2\x80\xa6 不,无法完成。

\n