奇怪的正则表达式

时间:2019-02-15 12:18:35

标签: perl

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

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

3 个答案:

答案 0 :(得分:10)

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'。如果第一个字符为'^',则测试被反转,并且[^/]为任何字符,但为'/'。

答案 1 :(得分:2)

尽管前面的答案在解释正则表达式时是正确的,但它们的确没有指出第二个正则表达式实际上已损坏。按照书面要求,

  • 行首
  • 后接零个或多个非.(点)字符
  • 后跟 ANY 字符,除了\n
  • 后跟一个.(点)字符
  • 行尾

证明:

$ echo "This should NOT match" | perl -ne 'print if m{^[^.]*.[^.]$}'
This should NOT match          <--- INCORRECT MATCH
$ echo "This should. match"    | perl -ne 'print if m{^[^.]*.[^.]$}'
                               <--- INCORRECT MIS-MATCH
$ echo "This should match.!"   | perl -ne 'print if m{^[^.]*.[^.]$}'
This should match.!            <-- CORRECT (by luck)
$ echo "This should match."    | perl -ne 'print if m{^[^.]*.[^.]$}'
This should match.             <-- CORRECT

正确将是

  • .需要转义(\.
  • 第二个字符类需要一个*
$ echo "This should NOT match" | perl -ne 'print if m{^[^.]*\.[^.]*$}'
                               <-- CORRECT
$ echo "This should. match"    | perl -ne 'print if m{^[^.]*\.[^.]*$}'
This should. match             <-- CORRECT
$ echo "This should match.!"   | perl -ne 'print if m{^[^.]*\.[^.]*$}'
This should match.!            <-- CORRECT
$ echo "This should match."    | perl -ne 'print if m{^[^.]*\.[^.]*$}'
This should match.             <-- CORRECT

答案 2 :(得分:1)

第一个表达式:m匹配{打开表达式^首行,[^ /] *任何非'/'0或多次的字符,'/'文字'/',再次为[^ /] *,$ end },则关闭表达式。