是什么意思,s#^.*/##s
因为我知道在模式中'.'表示它可以表示除 . 之外的随机字母\n。
那么'.*'应该代表随机字母的随机数量个数。
但是在书中它说这将删除所有unix类型的路径。
我的问题是,这是否意味着我可以用空格替换随机字母的随机数量?
s -> 替代 # -> 模式分隔符 ^.* -> 所有字符从头开始 0 次或更多次 / -> 字面量 / ## -> 替换为空(2 个分隔符) s -> 单行模式(点可以匹配换行符)
替换通常使用/字符作为分隔符 ( s/this/that/),但如果更方便,您可以使用其他标点符号。在这种情况下,#使用 是因为正则表达式本身包含一个/字符;如果/用作分隔符,/则模式中的任何内容都必须转义为\/. (#不是我会选择的角色,但它完全有效。)
^匹配字符串(或行;见下文)的开头
.*/匹配直到并包括一个/字符的任何字符序列。由于*是greedy,它将匹配所有字符,包括最后一个 /字符;任何前面/的字符都被.*. (final/不是,因为如果.*匹配所有/字符,final/将无法匹配。)
尾随s修饰符将字符串视为单行,即.匹配任何字符,包括换行符。有关更多信息,请参阅中的m和s修饰符。perldoc perlre
所以这:
s#^.*/##s
将字符串开头($_在这种情况下,因为这是默认设置)到最后一个/字符的所有内容都替换为空。
如果 中没有/字符$_,则匹配失败并且替换不执行任何操作。
这可用于替换绝对或相对路径名的所有目录组件,例如更改/home/username/dir/file.txt为file.txt.
它将删除字符串中的所有字符,包括由于修饰符而导致的换行符s,直到包含最后一个斜杠。
请原谅有点迂腐。但我一直看到这一点,我认为把它做好很重要。
s#^.*/##s不是正则表达式。
^.*是一个正则表达式。
s///是替换运算符。
替换运算符有两个参数。第一个是正则表达式。第二个是替换字符串。
替换运算符(与 Perl 中的许多其他类似引号的运算符一样)允许您更改使用的分隔符。
替换运算符也是如此s###(仅使用#而不是/)。
s#^.*/##表示“查找与正则表达式匹配的文本^.*/并将其替换为空字符串。s最后是一个更改正则表达式的选项,以便.匹配“\n”以及所有其他字符。