考虑字符串“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]:
原文链接:https://www.f2er.com/regex/357012.htmlregex = "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作为替代方案之一.