Perl正则表达式:你如何匹配perl中的多个单词?

时间:2014-04-22 11:44:45

标签: regex perl

我正在编写一个小脚本,该脚本应该匹配另一个文件中的所有字符串(“”和“之间的单词包括”“和”符号“)。

以下是我目前正在使用的正则表达式语句,但它只生成'(.*)'而不是"(.*)"的结果

my @string_matches = ($file_string =~ /'(.*)' | "(.*)"/g);

print "\n@string_matches";

另外,我怎样才能在结果中包含“”或“”符号?(打印出“字符串”而不是字符串) 我试过在网上搜索但是找不到这个

的任何材料

$ file_string基本上是整个文件的字符串版本。

3 个答案:

答案 0 :(得分:2)

使用此:'(.*?)' | "(.*?)"

我猜 贪心 运算符正在选择最后一个'的字符串。让它 懒惰

IMHO 使用这个正则表达式:

['"][^'"]*?['"]

这也将解决你在比赛中没有得到引号的问题。

演示:http://regex101.com/r/dI6gD7

答案 1 :(得分:0)

您可以使用'[^']*'匹配单引号之间的字符串,"[^"]*"表示双引号。

如果您想支持其他功能,例如转义序列,则应考虑使用模块Text::ParseWordsText::Balanced

注意:

  1. 由于*的贪婪,'.*'将匹配第一个和最后一个单引号之间的所有字符,如果您的字符串有多个单引号子字符串,这只会给出一个匹配而不是几个。

  2. 您可以使用('[^']*')代替'([^']*)'来捕获单引号和它们之间的子字符串,双引号类似。

  3. 由于'[^']*'"[^"]*"无法同时匹配,m/('[^']*')|("[^"]*")/ /g会在返回的列表中显示undefm/('[^']*'|"[^"]*")/g在列表上下文中,使用#!/usr/bin/perl use strict; use warnings; use feature qw(switch say); use Data::Dumper; my $file_string = q{Test "test in double quotes" test 'test in single quotes' and "test in double quotes again" test}; my @string_matches = ($file_string =~ /('[^']*'|"[^"]*")/g); local $" = "\n"; print "@string_matches\n"; 可以解决此问题。

  4. 这是一个测试程序:

    $ perl t.pl 
    "test in double quotes"
    'test in single quotes'
    "test in double quotes again"
    

    测试:

    {{1}}

答案 2 :(得分:0)

#!/usr/local/bin/perl
open my $fh, '<', "strings.txt"; #read the content of the file and assign it to $string;
read $fh, my $string, -s $fh;
close $fh;

    while ($string =~ m/^['"]{1}(.*?)['"]{1,}$/mg) {
        print $&;
    }