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