考虑字符串"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"
正则表达式替换似乎工作..
合并您的两个否定字符类并[^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
作为替代方案之一.