我对 perl 比较陌生,如果这个问题很简单并且我遗漏了一些完全明显的东西,我提前道歉,但是,我已经四处寻找答案几天了,但找不到解决方案。
我正在尝试使用正则表达式来匹配第一个实例,其中 A 后跟 C,而 A 和 C 之间没有另一个 A。请注意,在此文本字符串中,在第一个 AC 组合之后还有其他实例也可能适合 AC, (特别注意ADC)这是文本:
$text = "AAA ABC ADE AFG ADC AHI AJK AIZ XXB NBV";
我第一次尝试:
@finds1=$TEXT=~m/(A.*?C)/;
$result = $finds1[0];
print "result = $result\n";
这将打印以下内容:
result = AAA ABC
当我想要的只是:
result = ABC
请注意,我正在尝试创建一个可以在 B 可以是任何字符串的情况下使用的正则表达式。例如 ADC、AFGHJKC、AYUIOKJHGTC。
接下来我尝试使用前瞻语句和 if then else 语句。这是代码:
@finds1=$TEXT=~m/(A(?(?!.*?A.*?C).*?C|Z{100}))/;
$result = $finds1[0];
print "result = $result\n";
正则表达式 (A) 的第一部分告诉 perl 找到 A。一旦找到,perl 就会处理 if then else 语句,其中条件语句是没有 . ?A. ?A 跟在 A 后面的实例, 如果没有找到,则 perl 查找 .*?C,如果至少找到一个,则搜索 100 个 Z 实例。我试图解析有 100 个 Z。)
这将返回:
result = ADC
在第一次识别 C 后,我考虑过使用积极的后视。但是,就像我上面提到的,第一个 AC 组合之间没有 A 的字符数是可变的。据我所知,PERL 不能进行可变长度的后视。
非常感谢您提供的任何帮助或指导!
提前致谢!