perl regex:两个字符之间的负向前瞻

时间:2014-04-23 04:13:42

标签: regex perl negative-lookahead

如何在正则表达式中包含两个字符之间的模式?

我想在" "

之间的文字中打印以下文字中的所有内容
This is an "example".

This "is" "an" example.

"This" is an example.

这是我到目前为止所尝试过的,但我想我错过了一些东西:

m/(?!"(.*)").*/g

4 个答案:

答案 0 :(得分:1)

$s = 'This "is" "an" example';
@words = ($s =~ /"([^"]*)"/g);

@words包含" "

之间的所有字词

答案 1 :(得分:0)

您可以使用s///删除双引号之间的子字符串。

这是一个测试程序:

#!/usr/bin/perl

use strict;
use warnings;

use feature qw(switch say);

use Data::Dumper;

while (<DATA>) {
    chomp;
    s/"[^"]*"//g;
    print "$_\n";
}

__DATA__
This is an "example".
This "is" "an" example.
"This" is an example.

结果:

$ perl t.pl
This is an .
This   example.
 is an example.

答案 2 :(得分:0)

与redraiment的解决方案类似:

@words_in_quotes = ($s =~ /"(.*?)"/g)

不需要后面的断言。

答案 3 :(得分:0)

这几乎是XY Problem

的定义

断言是正则表达式的一种高级功能,对于您必须解决的大多数问题,很可能不需要断言。

相反,我会专注于基础知识,可能从贪婪与非贪婪的匹配开始。

@quoted_words = ($s =~ /"(.*?)"/g);

任何时候,您使用量词*+,它会尝试尽可能多地匹配,然后再回过头来。您可以通过减少应匹配的字符类型和添加边界条件来限制此操作,或者通过添加问号将匹配更改为非贪婪来限制此操作。 *?+?