【问题标题】:regular expression what's the meaning of this regular expression s#^.*/##s正则表达式 这个正则表达式是什么意思 s#^.*/##s
【发布时间】:2013-08-29 18:04:54
【问题描述】:

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

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

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

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

【问题讨论】:

标签: regex perl


【解决方案1】:
s -> 替代 # -> 模式分隔符 ^.* -> 所有字符从头开始 0 次或更多次 / -> 字面量 / ## -> 替换为空(2 个分隔符) s -> 单行模式(点可以匹配换行符)

【讨论】:

  • "all chars 0 or more times from the beginning" 是一个糟糕的解释。
【解决方案2】:

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

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

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

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

所以这个:

s#^.*/##s

将字符串开头(本例中为$_,因为这是默认设置)到最后一个/ 字符之间的所有内容替换为空。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      请原谅我有点迂腐。但我不断看到这一点,我认为正确处理它很重要。

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

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

      s/// 是替换运算符。

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

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

      所以s### 也是一个替换运算符(只是使用# 而不是/)。

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

      【讨论】:

        猜你喜欢
        • 2021-04-05
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 2011-05-21
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 2011-06-15
        相关资源
        最近更新 更多