正则表达式正则表达式s#^。* / ## s的含义是什么

时间:2013-08-28 18:02:37

标签: regex perl

s#^.*/##s的含义是什么 因为我知道模式'.'表示它可以代表除\n之外的随机字母。

然后'.*'应代表随机字母的随机数量。

但在书中它说这将删除所有unix类型的路径。

我的问题是,这是否意味着我可以用空格替换随机字母的随机数量?

4 个答案:

答案 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中的ms修饰符。

所以这个:

s#^.*/##s

替换字符串开头的所有内容(在这种情况下为$_,因为这是默认值)直到最后一个/字符。

如果/中没有$_个字符,则匹配失败,替换不执行任何操作。

这可用于替换绝对路径名或相对路径名的所有目录组件,例如将/home/username/dir/file.txt更改为file.txt

答案 3 :(得分:0)

请原谅一点迂腐。但我一直看到这一点,我认为正确的做法很重要。

s#^.*/##s不是正则表达式。

^.*是正则表达式。

s///是替换运算符。

替换运算符有两个参数。第一个是正则表达式。第二个是替换字符串。

替换运算符(与Perl中许多其他类似引号的运算符一样)允许您更改所使用的分隔符。

因此s###也是替换运算符(仅使用#代替/)。

s#^.*/##表示“找到与正则表达式^.*/匹配的文本,并将其替换为空字符串。最后的s是一个更改正则表达式的选项,以便.匹配“\ n”以及所有其他字符。