我正在编写一个小脚本,该脚本应该匹配另一个文件中的所有字符串(“”和“之间的单词包括”“和”符号“)。
以下是我目前正在使用的正则表达式语句,但它只生成'(.*)'
而不是"(.*)"
的结果
my @string_matches = ($file_string =~ /'(.*)' | "(.*)"/g);
print "\n@string_matches";
另外,我怎样才能在结果中包含“”或“”符号?(打印出“字符串”而不是字符串) 我试过在网上搜索但是找不到这个
的任何材料$ file_string基本上是整个文件的字符串版本。
答案 0 :(得分:2)
使用此:'(.*?)' | "(.*?)"
我猜 贪心 运算符正在选择最后一个'
的字符串。让它 懒惰
IMHO 使用这个正则表达式:
['"][^'"]*?['"]
这也将解决你在比赛中没有得到引号的问题。
答案 1 :(得分:0)
您可以使用'[^']*'
匹配单引号之间的字符串,"[^"]*"
表示双引号。
如果您想支持其他功能,例如转义序列,则应考虑使用模块Text::ParseWords或Text::Balanced。
注意:
由于*
的贪婪,'.*'
将匹配第一个和最后一个单引号之间的所有字符,如果您的字符串有多个单引号子字符串,这只会给出一个匹配而不是几个。
您可以使用('[^']*')
代替'([^']*)'
来捕获单引号和它们之间的子字符串,双引号类似。
由于'[^']*'
和"[^"]*"
无法同时匹配,m/('[^']*')|("[^"]*")/
/g
会在返回的列表中显示undef
个m/('[^']*'|"[^"]*")/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";
可以解决此问题。
这是一个测试程序:
$ 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 $&;
}