【发布时间】:2012-07-03 23:40:13
【问题描述】:
我对 perl 比较陌生,如果这个问题很简单并且我遗漏了一些完全明显的东西,我提前道歉,但是,我已经四处寻找答案几天了,但找不到解决方案。
我正在尝试使用正则表达式来匹配第一个实例,其中 A 后跟 C,而 A 和 C 之间没有另一个 A。请注意,在此文本字符串中,第一个 A.C 组合后面还有其他实例也可能适合A.C,(特别注意 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 实例。(我让 Perl 继续前进的方法是在这个文本和我试图解析的文本中都没有 100 Zs。)
这会返回:
result = ADC
在第一次识别 C 之后,我考虑过使用积极的后视。但是,就像我上面提到的,第一个 A.C 组合之间没有 A 的字符数是可变的。据我所知,PERL 不能进行可变长度的后视。
非常感谢您提供的任何帮助或指导!!
提前致谢!
【问题讨论】:
-
我对 /A[b-zB-Z]*?C/ 符合要求的解释有误吗?
-
你是对的。它确实适用于此文本。感谢您的答复。您将如何修改它以适应 A 和 C 之间的空间(例如 $text = "AAA A B C ADE AFG ADC AHI AJK AIZ XXB NBV";
-
在这里,我将对其进行扩展,使其值得回答,并在那里回答您的问题。
-
像这样:/A\s*[b-zB-Z]*?\s*C/
-
真的,完全没有理由这么复杂。 /A[b-zB-Z\s]*?C/ 也可以,而且要简单得多。
标签: perl