【问题标题】:How to delete everything before a variable number with Perl/Regex如何使用 Perl/Regex 删除变量号之前的所有内容
【发布时间】:2013-05-03 19:26:35
【问题描述】:

我正在用 Perl 清理一个文件,但有一行代码有点难以处理。

它看起来像:

^L#$%@@$^%^3456 [rest of string]

但我需要摆脱3456之前的所有内容

问题在于3456 每次都会更改,因此我需要使用非特定的 sed 命令。我还应该补充一点,3456 之前的内容永远不会是数字

现在s/^.*$someString/$someString/ 在我处理字符串时可以工作,但当它不是字符串时,同一行就不能工作。

无论如何,请帮忙!

【问题讨论】:

  • 正则表达式需要匹配的模式,而您还没有真正提供足够的东西来使用。您需要删除的部分是否总是包含非单词字符?
  • 它可以是数字以外的任何东西。
  • 每次需要清除的垃圾量会一样吗?

标签: regex perl


【解决方案1】:

这将删除行首的所有非数字,

s/^ \D+ //x;

【讨论】:

    【解决方案2】:

    您可能想要一个带有前瞻和非贪婪匹配的正则表达式。

    前瞻是在当前位置匹配但不消耗字符的模式:

    my $str = "abc";
    $str =~ s/a(?=b)//; # $str eq "bc"
    

    非贪婪匹配通过附加? 修改*+ 运算符。现在它将匹配尽可能少的字符。

    $str = "abab";
    $str =~ s/.*(?=b)//; # $str eq "b"
    $str = "abab";
    $str =~ s/.*?(?=b)//; # $str eq "bab"
    

    要插入不应被视为模式的字符串,请使用\Q...\E 保护它:

    $re = "^foo.?"
    $str = "abc^foo.?baz";
    $str =~ s/^.*?(?=\Q$re\E)//; # $str eq "baz"
    

    【讨论】:

      【解决方案3】:

      我需要摆脱 3456 之前的一切

      (?:(?!STRING).)*STRING 就像 [^CHAR]*CHAR,所以

      s/^(?:(?!3456).)*//s;
      

      也可以使用非贪婪修饰符 (.*?) 来完成,但我不喜欢使用它。

      s/^.*?3456/3456/s;
      s/^.*?(3456)/$1/s;  # Without duplication.
      s/^.*?(?=3456)//s;  # Without the performance penalty of captures.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-07
        • 2020-02-28
        • 1970-01-01
        • 2021-07-04
        • 2021-03-05
        • 2019-10-11
        • 1970-01-01
        • 2011-11-12
        相关资源
        最近更新 更多