首页 > 解决方案 > 奇怪的正则表达式

问题描述

此正则表达式将精确匹配一行中的一个/ 和一个.。但是为什么会匹配呢?谁能清楚地向我解释这个正则表达式中每个字符的角色?

if ($fp =~ m{^[^/]*/[^/]*$} and $fp =~ m{^[^.]*.[^.]$})
{
    print $fp;
}

标签: perl

解决方案


if($fp =~ m{^[^/]*/[^/]*$} and $fp =~ m{^[^.]*.[^.]$}) {
            ^\ / ^^\ / ^^
            | |  || |  ||
------------- |  || |  ||
begin line    |  || |  ||
---------------  || |  ||
any char but /   || |  ||
------------------| |  ||
zero or more      | |  ||
------------------  |  ||
one /               |  ||
---------------------  ||
any char but /         ||
------------------------|
zero or more            |
------------------------|
end of line

所以它搜索

  • 开始或行 (^),

  • 后跟零次或多次出现 (*) 的任何字符,但 / ([^/])

  • 后跟一个 /

  • 后跟零次或多次出现 (*) 的任何字符,但 / ([^/])

  • 后跟行尾 ($)

这 ”。” 搜索类似,如果两者都为真,则“if”触发。

请注意,[...]在一个范围内搜索一个字符。例如[abc]搜索“a”、“b”或“c”。如果第一个字符是 '^',则测试反转并且[^/]是任何字符,但 '/'。


推荐阅读