此正则表达式将精确匹配一行中的一个/
和一个.
。但是为什么匹配呢?谁能清楚地向我解释此正则表达式中的每个角色角色?
if ($fp =~ m{^[^/]*/[^/]*$} and $fp =~ m{^[^.]*.[^.]$})
{
print $fp;
}
答案 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)
尽管前面的答案在解释正则表达式时是正确的,但它们的确没有指出第二个正则表达式实际上已损坏。按照书面要求,
.
(点)字符\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 },则关闭表达式。