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

考虑字符串“AB 1 BA 2 AB 3 BA”.如何以非贪婪的方式(在awk中)匹配“AB”和“BA”之间的内容?

我尝试过以下方法:

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)
}'

没有输出.我认为不匹配的原因是“AB”和“BA”之间存在奇数个字符.如果我用“AB 11 BA 22 AB 33 BA”替换str,正则表达式似乎有效..

最佳答案
合并两个否定的字符类,并从第二个替换中删除[^ A]:

regex = "AB([^AB]|B|[^B]A)*BA"

然而,这个正则表达式在字符串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

由于在交替中匹配A的唯一方法是匹配除B之外的字符,我们可以安全地使用简单B作为替代方案之一.

转载注明原文:正则表达式 – 非贪婪的正则表达式匹配awk中的多字符分隔符 - 代码日志