Understanding Perl regular expression modifers /m and /s
我一直在阅读带有修饰符s m和g的perl正则表达式。我理解//g是一个全局匹配,在这里它将是一个贪婪的搜索。
但是我对修饰符s和m感到困惑。有人能用代码示例解释s和m之间的区别吗,以展示它是如何不同的?我试过在线搜索,它只给出链接http://perldoc.perl.org/perlre.html modifiers中的解释。在StackOverflow中,我甚至看到人们一起使用S和M。S不是M的对立面吗?
我无法使用m匹配多行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | use warnings; use strict; use 5.012; my $file; { local $/ = undef; $file = <DATA>; }; my @strings = $file =~ /".*"/mg; #returns all except the last string across multiple lines #/"String"/mg; tried with this as well and returns nothing except String say for @strings; __DATA__ "This is string" "1!=2" "This is "string"" "string1"."string2" "String" "S t r i n g" |
在我看来,你链接到自己的文档是非常清楚的。如果你能解释你在理解它时遇到了什么问题,以及你是如何认为
简单地说,
"
你不应该把
更新
在修改后的问题中,您使用的是
把它改为
有几种方法可以解决这个问题。我建议更改您的模式,使您想要的字符串是双引号,后跟除双引号之外的任何字符序列,后跟另一个双引号。这里写的是
请看一下这个程序及其输出,注意我在每一场比赛开始时都放了一个雪佛龙
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | >>"This is string" >>"1!=2" >>"This is " >>"" >>"string1" >>"string2" >>"String" >>"S t r i n g" |
如你所见,除了在
更新
我还是把这件事做完吧。要忽略转义双引号并将其视为字符串的一部分,我们需要接受
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >>"This is string" >>"1!=2" >>"This is "string"" >>"string1" >>"string2" >>"String" >>"S t r i n g" |
使用
例子:
1 2 3 4 5 6 | $_ ="foo bar "; /foo$/, /^bar/ do not match /foo$/m, /^bar/m match |
使用
1 2 3 4 5 6 | $_ ="cat dog goldfish"; /cat.*fish/ does not match /cat.*fish/s matches |
可以同时使用
1 2 3 4 5 6 7 8 9 10 11 12 | $_ ="100 101 102 103 104 105 "; /^102.*104$/ does not match /^102.*104$/s does not match /^102.*104$/m does not match /^102.*104$/sm matches |
和
由于您在示例中转义了引号,所以regex不是执行所需操作的最佳工具。如果不是这样的话,你想要两个报价之间的所有东西,那么
博罗丁的regex将为这个实验室任务的例子工作。
但是,反斜杠也可以自行退出。当一个字符串中包含Windows路径时,就会出现这种情况,因此以下regex将捕获这种情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | use warnings; use strict; use 5.012; my $file = do { local $/; <DATA>}; my @strings = $file =~ /"(?:(?>[^"\\]+)|\\.)*"/g; say"<$_>" for @strings; __DATA__ "This is string" "1!=2" "This is "string"" "string1"."string2" "String" "S t r i n g" "C:\\windows\\style\\path\" "another string" |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <"This is string"> <"1!=2"> <"This is "string""> <"string1"> <"string2"> <"String"> <"S t r i n g"> <"C:\\windows\\style\\path\"> <"another string"> |
要快速解释模式:
1 2 3 4 5 6 7 8 9 10 11 | my @strings = $file =~ m{ " (?: (?> # Independent subexpression (reduces backtracking) [^"\\]+ # Gobble all non double quotes and backslashes ) | \\. # Backslash followed by any character )* " }xg; # /x modifier allows whitespace and comments. |