1

我对 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 不能进行可变长度的后视。

非常感谢您提供的任何帮助或指导!

提前致谢!

4

2 回答 2

3

你不只是想要

/A[^AC]*C/
于 2012-07-04T00:39:06.353 回答
0

据我所知,你想要:

  • 一个“A”
  • 后跟任意数量的非 A 字符
  • 后跟一个“C”

这可以通过正则表达式来实现

/A[B-Z]*?C/

方括号[]中的字符代表一个字符类。使用字符类,您可以告诉正则表达式引擎只匹配几个字符中的一个。只需将要匹配的字符(或字符范围)放在方括号 ( http://www.regular-expressions.info/charclass.html ) 之间。假设你想用另一个字母 Q 来做这个,你会有一个稍微不同的字符类

/Q[A-PR-Z]*?C/

如果您想修改它以适应 A 和 C 之间的空间,您可以通过两种不同的方式来处理它。你可以否定一个字符类,它会匹配除其中的字符之外的任何字符,如下所示:

/A[^AC]*C/

它将匹配一个 A,然后是除 A 和 C 之外的任意数量的字符,然后是一个 C。

或者,您可以在原始字符类中添加一个空格,如下所示:

/A[B-Z ]*?C/(注意Z后面的空格)

如果您想要任何类型的空格,请将空格替换为 \s,它表示任何空格,如下所示:

/A[B-Z\s]*?C/

于 2012-07-04T00:03:01.113 回答