0

是什么意思,s#^.*/##s 因为我知道在模式中'.'表示它可以表示除 . 之外的随机字母\n

那么'.*'应该代表随机字母的随机数量个数。

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

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

4

4 回答 4

5
s -> 替代
# -> 模式分隔符
^.* -> 所有字符从头开始 0 次或更多次
/ -> 字面量 /
## -> 替换为空(2 个分隔符)
s -> 单行模式(点可以匹配换行符)
于 2013-08-28T18:07:54.140 回答
4

替换通常使用/字符作为分隔符 ( s/this/that/),但如果更方便,您可以使用其他标点符号。在这种情况下,#使用 是因为正则表达式本身包含一个/字符;如果/用作分隔符,/则模式中的任何内容都必须转义为\/. (#不是我会选择的角色,但它完全有效。)

^匹配字符串(或行;见下文)的开头

.*/匹配直到并包括一个/字符的任何字符序列。由于*greedy,它将匹配所有字符,包括最后一个 /字符;任何前面/的字符都被.*. (final/不是,因为如果.*匹配所有/字符,final/将无法匹配。)

尾随s修饰符将字符串视为单行,即.匹配任何字符,包括换行符。有关更多信息,请参阅中的ms修饰符。perldoc perlre

所以这:

s#^.*/##s

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

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

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

于 2013-08-28T18:39:05.560 回答
3

它将删除字符串中的所有字符,包括由于修饰符而导致的换行符s,直到包含最后一个斜杠。

于 2013-08-28T18:05:41.267 回答
0

请原谅有点迂腐。但我一直看到这一点,我认为把它做好很重要。

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

^.*是一个正则表达式。

s///是替换运算符。

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

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

替换运算符也是如此s###(仅使用#而不是/)。

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

于 2013-08-29T10:04:54.737 回答