The 文档 http://perldoc.perl.org/perlre.html#Modifiers我认为你与自己的联系非常清楚。如果您能解释一下您在理解它时遇到的问题以及您如何认为这一点,将会有所帮助/s
and /m
是对立的。
非常简短地,/s
更改点元字符的行为.
这样它就可以匹配任何字符。通常它匹配除换行符之外的任何内容"\n"
,因此将字符串视为s单行,即使它包含换行符。
/m
修改插入符号^
和美元$
元字符,以便它们在换行符处匹配within字符串,将其视为m多行字符串。通常它们只会在字符串的开头和结尾匹配。
你不应该与/g
修饰语是“贪婪”。那是为了g全局匹配将找到all字符串中模式的出现次数。期限greedy通常是量词行为的用户within模式。例如.*
之所以说是贪婪的,是因为它会匹配尽可能多的字符,而不是.*?
这将匹配为few尽可能的字符。
Update
在您修改后的问题中,您正在使用/".*"/mg
,其中/m
是无关紧要的,因为如上所述,该修饰符仅改变$
and ^
元字符,而您的模式中没有元字符。
将其更改为/".*"/sg
改进了一些事情.
现在可以匹配每行末尾的换行符,因此该模式可以匹配多行字符串。 (注意,这是object被认为是的字符串“单线”这里 - 即匹配的行为就好像其中没有换行符一样.
)然而这里是传统的含义greedy,因为该模式现在匹配从第一行中的第一个双引号到最后一行末尾的最后一个双引号的所有内容。我想这不是你想要的。
有几种方法可以解决这个问题。我建议更改您的模式,以便您想要的字符串是双引号,后跟任意字符序列除了双引号,后跟另一个双引号。这是写的/"[^"]*"/g
(请注意,/s
修饰符不再是必要的,因为现在模式中没有点)并且几乎完成了您想要的操作,只是转义的双引号被视为结束模式。
看一下这个程序及其输出,请注意我已经放置了一个 V 形符号>>
在每场比赛开始时以便区分
use strict;
use warnings;
my $file = do {
local $/;
<DATA>;
};
my @strings = $file =~ /"[^"]*"/g;
print ">> $_\n\n", for @strings;
__DATA__
"This is string"
"1!=2"
"This is \"string\""
"string1"."string2"
"String"
"S
t
r
i
n
g"
output
>> "This is string"
>> "1!=2"
>> "This is \"
>> ""
>> "string1"
>> "string2"
>> "String"
>> "S
t
r
i
n
g"
正如你所看到的,现在一切都井然有序,除了"This is \"string\""
它找到了两个匹配项,"This is \"
, and ""
。解决这个问题可能比您想要的更复杂,但这是完全可能的。如果您也需要修复,请这么说。
Update
我不妨结束这件事。要忽略转义双引号并将它们视为字符串的一部分,我们需要接受either \"
or除双引号之外的任何字符。这是使用正则表达式交替运算符完成的|
并且必须分组在非捕获括号内(?: ... )
。最终结果是/"(?:\\"|[^"])*"/g
(反斜杠本身必须被转义,因此它会加倍),当放入上面的程序时,会产生这个输出,我认为这就是你想要的。
>> "This is string"
>> "1!=2"
>> "This is \"string\""
>> "string1"
>> "string2"
>> "String"
>> "S
t
r
i
n
g"