1
if ($key =~ /^\s*(\S.*?)\s*$/o)

我对 (\S.*?) 的含义特别困惑。任何人都可以为我解释一下吗?谢谢。

4

4 回答 4

6

这应该可以帮助您理解

正则表达式可视化

对此具体来说:(\S.*?)

  • (开始您的捕获组(第 1 组)
  • \S是非空白字符
  • .是任何字符;*?是“零次或多次”(非贪婪)
  • )结束你的捕获组

用简单的英语,你的整个正则表达式说

  • 从字符串的开头
  • 匹配零个或多个空格
  • 启动捕获组
    • 寻找非空白
    • 后跟任何字符零次或多次
  • 结束捕获组
  • 匹配零个或多个空格
  • 然后是字符串的结尾

一种奇怪的正则表达式,恕我直言。

于 2013-08-30T06:03:59.467 回答
5

编码:

$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

于 2013-08-30T06:25:29.453 回答
1

这里有很多信息:

http://perldoc.perl.org/perlre.html#Regular-Expressions

我还使用它在使用它们之前检查正则表达式 - 我发现它非常有用(并且它还很好地解释了每个步骤的作用):

http://www.regex101.com/r/xV1vO6

于 2013-08-30T10:57:50.213 回答
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) 
于 2013-08-30T07:39:50.793 回答