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

 exu8145079 发布于 2023-02-08 09:37

考虑字符串"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)
}'

没有输出.我相信不匹配的原因是"AB"和之间有一个奇数个字符"BA".如果我str"AB 11 BA 22 AB 33 BA"正则表达式替换似乎工作..

1 个回答
  • 合并您的两个否定字符类并[^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之前的字符,我们可以安全地使用simple B作为替代方案之一.

    2023-02-08 09:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有