PERL:使用REGEX匹配字符串,而不在字符串中重复第一个标记。 (ABC,不是AAA ABC)

时间:2012-07-03 23:40:13

标签: perl

我对perl相对较新,如果这个问题很简单,我会提前道歉,而且我错过了一些完全明显的事情,但是,我现在已经在寻找答案了几天,而且可以&#39找到解决方案。

我正在尝试使用正则表达式来匹配第一个实例,其中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。

我接下来尝试使用look-forward结合if then else语句。这是代码:

@finds1=$TEXT=~m/(A(?(?!.*?A.*?C).*?C|Z{100}))/;
$result = $finds1[0];
print "result = $result\n";

REGEX的第一部分,(A,告诉perl找到A的出现。一旦找到,perl然后处理if then else语句,其中条件语句是没有实例。?A在A之后,如果没有找到,那么perl会找到。*?C,如果找到至少一个,那么它会搜索100个Z实例。(我的方法是让Perl继续运行在本文和我试图解析的文本中都没有100个Z.)

返回:

result = ADC    

在第一次识别C之后,我考虑过使用正面的后视镜。但是,正如我上面提到的,它们之间没有A的第一个A.C组合之间的字符数是可变的。据我所知,PERL不能做可变长度的后视镜。

您可以提供的任何帮助或指示都会非常感激!!

提前致谢!

2 个答案:

答案 0 :(得分:3)

你不想只是想要

/A[^AC]*C/

答案 1 :(得分: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之后的空格)

如果你想要任何类型的空格,用空格替换空格,代表任何空格,如下所示:

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