我对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不能做可变长度的后视镜。
您可以提供的任何帮助或指示都会非常感激!!
提前致谢!
答案 0 :(得分:3)
你不想只是想要
/A[^AC]*C/
答案 1 :(得分:0)
据我所知,你想要的是:
这可以使用正则表达式
来实现 /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/