Regex grep-P查找正好包含n A';s后面紧跟着nb';s

Regex grep-P查找正好包含n A';s后面紧跟着nb';s,regex,unix,grep,pcre,pcregrep,Regex,Unix,Grep,Pcre,Pcregrep,是否可以编写一个grep-p(PCRE)命令,该命令打印只包含a和B的行,这样就有n个a,后面紧跟着n个B,而没有其他字符。以确保这些是有效的匹配项: AB AAABBB AAAAAAABBBBBBB AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBB 虽然这些不是: AAABB ABBBBBB BBBA ABABA BBBBBBBB 对于普通正则表达式,您无法做到这一点-它们只能匹配常规上下文无关语言(在of languages中为类型3),而您想要匹配的是类

是否可以编写一个
grep-p
(PCRE)命令,该命令打印只包含
a
B
的行,这样就有n个
a
,后面紧跟着n个
B
,而没有其他字符。以确保这些是有效的匹配项:

AB
AAABBB
AAAAAAABBBBBBB
AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBB
虽然这些不是:

AAABB
ABBBBBB
BBBA
ABABA
BBBBBBBB

对于普通正则表达式,您无法做到这一点-它们只能匹配常规上下文无关语言(在of languages中为类型3),而您想要匹配的是类型2语言的经典示例

幸运的是,
perl
正则表达式在形式语言理论意义上不是很正规。您可以使用以下选项来匹配:

$perl-ne'print if/^((?>A(?1)B |))$/'input.txt
AB
阿阿巴
AAAAAABBBBB
AAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
$grep-P'^((?>A(?1)B |)$”input.txt
AB
阿阿巴
AAAAAABBBBB
AAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
(其中
input.txt
包含所有测试用例)

这将匹配一个空字符串(0 A后跟0 B),或一个以A开头的字符串,模式与字符串剩余部分(减去第一个和最后一个字符)的成功递归匹配,并以B结尾。如果A B出现在A之前,A出现在B之后,或A和B的总数不匹配,则将失败
(?>regex)
用于防止匹配失败后的回溯


如果您想强制执行
n>=1
,请将一对a和B提升到递归部分之外:
^a((?>a(?.1)B |))B$

请重新表述为问题。另外,您已经标记了perl,但这是一个grep问题。这可能是有可能的,但您尝试过什么吗?您尝试过什么?你有什么问题?请出示您的代码。事实上,一个完全相同的@JamesBrown链接。有一个有效的答案。投票结束