s#^.*/##s
的含义是什么
因为我知道模式'.'
表示它可以代表除\n
之外的随机字母。
然后'.*
'应代表随机字母的随机数量。
但在书中它说这将删除所有unix类型的路径。
我的问题是,这是否意味着我可以用空格替换随机字母的随机数量?
答案 0 :(得分:5)
s -> subsitution # -> pattern delimiter ^.* -> all chars 0 or more times from the begining / -> literal / ## -> replace by nothing (2 delimiters) s -> single line mode ( the dot can match newline)
答案 1 :(得分:3)
它将删除所有字符,包括由s
修饰符引起的换行符,在字符串中包含最后一个斜杠。
答案 2 :(得分:3)
替换通常使用/
字符作为分隔符(s/this/that/
),但如果更方便,则可以使用其他标点字符。在这种情况下,使用#
,因为正则表达式本身包含/
个字符;如果将/
用作分隔符,则模式中的任何/
都必须转义为\/
。 (#
不是我选择的角色,但它完全有效。)
^
匹配字符串的开头(或行;见下文)
.*/
匹配任意字符序列,包括/
个字符。由于*
贪婪,它将匹配包含 last /
字符的所有字符;任何precedng /
字符都被.*
“吃掉”。 (最终/
不是,因为如果.*
匹配所有/
字符,则最终/
将无法匹配。)
尾随s
修饰符将字符串视为单行,即使.
匹配包含换行符在内的任何字符。有关详细信息,请参阅perldoc perlre
中的m
和s
修饰符。
所以这个:
s#^.*/##s
替换字符串开头的所有内容(在这种情况下为$_
,因为这是默认值)直到最后一个/
字符。
如果/
中没有$_
个字符,则匹配失败,替换不执行任何操作。
这可用于替换绝对路径名或相对路径名的所有目录组件,例如将/home/username/dir/file.txt
更改为file.txt
。
答案 3 :(得分:0)
请原谅一点迂腐。但我一直看到这一点,我认为正确的做法很重要。
s#^.*/##s
不是正则表达式。
^.*
是正则表达式。
s///
是替换运算符。
替换运算符有两个参数。第一个是正则表达式。第二个是替换字符串。
替换运算符(与Perl中许多其他类似引号的运算符一样)允许您更改所使用的分隔符。
因此s###
也是替换运算符(仅使用#
代替/
)。
s#^.*/##
表示“找到与正则表达式^.*/
匹配的文本,并将其替换为空字符串。最后的s
是一个更改正则表达式的选项,以便.
匹配“\ n”以及所有其他字符。