如何使用Perl / Regex删除变量号之前的所有内容

时间:2013-05-03 19:26:36

标签: regex perl

我正在使用Perl清理文件,我有一行有点难以使用。

它看起来像:

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

但我需要摆脱3456

之前的所有事情

问题是3456每次都会更改,所以我需要使用非特定的sed命令。我还应该补充说3456之前的东西永远不会是数字

现在s/^.*$someString/$someString/在我使用字符串时起作用,但是当它不是字符串时,同一行不起作用。

无论如何,请帮忙!

3 个答案:

答案 0 :(得分:1)

这将删除行开头的所有非数字

s/^ \D+ //x;

答案 1 :(得分:0)

你可能想要一个具有前瞻的正则表达式,以及非贪婪的匹配。

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

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"

答案 2 :(得分:0)

  

我需要在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.