perl正则表达式的含义是什么?

时间:2013-08-30 06:02:41

标签: regex perl

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

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

4 个答案:

答案 0 :(得分:6)

这可以帮助您理解

Regular expression visualization

具体如下:(\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

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

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