通过引号perl查找单词环绕

时间:2014-03-15 02:20:54

标签: regex perl

我正在逐行读取另一个perl文件,需要通过单引号或双引号查找任何单词或单词组。这是我正在阅读的代码示例:

#!/usr/bin/env perl
use strict;
use warnings;

my $string = 'Hello World!';
print "$string\n"; 

基本上,我需要找到并打印出“Hello World!'和" $ string \ n"。

我已经正确读取了我的文件并将其内容存储在一个数组中。从那里我循环遍历每一行,并使用正则表达式在引号中找到所需的单词集:

for(@contents) {
   if(/\"|\'[^\"|\']*\"|\'/) {
       print $_."\n";
   }
}

给出了以下输出:

my $string = 'Hello World!';
print "$string\n"; 

我尝试用空格分割内容然后尝试找到匹配,但这给了我这个:

'Hello
World!'
"$string\n";

我已经尝试了其他建议的众多解决方案,但无济于事。我也试过Text :: ParseText并使用parse_line,但这给了我完全错误的输出。

任何可以帮助我的想法?

2 个答案:

答案 0 :(得分:4)

只需要在正则表达式中添加一些捕获括号,而不是打印整行

use strict;
use warnings;

while (<DATA>) {
    if(/(["'][^"']*["'])/) {
        print "$1\n";
    }
}

__DATA__
#!/usr/bin/env perl
use strict;
use warnings;

my $string = 'Hello World!';
print "$string\n"; 

注意,你的正则表达式有很多缺陷。例如,'\''无法正常匹配。 "He said 'boo'"也不会。为了更接近你,你必须做一些平衡的括号检查,但是没有任何完美的解决方案。

对于更接近的解决方案,您可以使用以下内容:

if(/('(?:(?>[^'\\]+)|\\.)*'|"(?:(?>[^"\\]+)|\\.)*")/) {

这会处理我的上述异常以及print "how about ' this \" and ' more \n";之类的字符串,但仍然存在使用qq{}q{}等边缘情况。更不用说跨越多行的字符串了。

换句话说,如果你的目标是完美的,那么这个项目可能超出了大多数人的技能范围,但希望上面的内容会有所帮助。

答案 1 :(得分:2)

也许你可以拥有多个&#34;字符串&#34;为了捕获每一行,一个解决方案可能是:

while(my $line=<STDIN>) {
    while( $line =~ /[\'\"](.*?)[\'\"]/g ) {
        print "matched: '$1'\n";
    }
}

即输入:

#!/usr/bin/env perl
use strict;
use warnings;

my $string = 'Hello World!' . 'asdsad';
print "$string\n";

并执行代码将为您提供:

matched: 'Hello World!'
matched: 'asdsad'
matched: '$string\n'