if ($key =~ /^\s*(\S.*?)\s*$/o)
我对(\ S。*?)的含义特别感到困惑。任何人都能为我解释一下吗?谢谢。
答案 0 :(得分:6)
这可以帮助您理解
具体如下:(\S.*?)
(
开始您的捕获组(第1组)\S
是非空格字符.
是任何角色; *?
是“零次或多次”(非贪婪))
结束您的捕获组用简单的英语,你的整个正则表达式说
有点奇怪的正则表达式,imho。
答案 1 :(得分:5)
代码:
$key =~ /^\s*(\S.*?)\s*$/o
将在$1
中生成一个字符串,其中所有前导和尾随空格字符(由\s
定义)将被删除。
代码的意图似乎在检查字符串是否只包含空格,并同时获取修剪后的字符串。但是,只有假设才能使字符串不包含多行,而正则表达式将无法匹配。例如," somestring\nsomestring \nmore string"
。
总结一下,测试拒绝的案例是:
\s
定义)/\S.*\n.*\S/s
1 。 1 Perl中的.
是否等同于[\n]
?当s
修饰符无效时,它会排除其他任何内容吗?
至于最后的o
修饰符,它似乎是an obsolete modifier in the later versions of Perl。修饰符可防止旧版本的Perl不必要地重新编译模式,但当前使用仅限于几个用例。查看perlop
文档(搜索/o
)以获取更多信息。
答案 2 :(得分:1)
除了这个正则表达式的严格含义之外(@naomik有详细记载),整个指令:
if ($key =~ /^\s*(\S.*?)\s*$/o)
表示:
如果$key
与正则表达式匹配,则组$1
将包含与$key
相同的组,而不包含前导和尾随空格。
\o
修饰符(现已过时)避免重新编译正则表达式。您应该使用qr/^\s*(\S.*?)\s*$/
代替:
my $re = qr/^\s*(\S.*?)\s*$/;
if ($key =~ $re)
答案 3 :(得分:1)
这里有很多信息:
http://perldoc.perl.org/perlre.html#Regular-Expressions
我在使用之前也使用它来检查正则表达式 - 我发现它非常有用(并且它也很好地解释了每个步骤的作用):