如何从第一个非alpha字符开始删除字符串中的所有字符?

时间:2009-02-03 16:52:44

标签: regex perl string parsing

如果不是某些情况,这会更容易。

示例数据:

KENP989SD
KENP913E
KENPX189R
KENP913

我可以用什么正则表达式从第一个非alpha字符开始删除字符串中的所有字符?基本上,我想找到第一个非alpha字符,然后在不管char类型的情况下切断所有内容。

应用正则表达式后,这些数据应为:

KENP
KENP
KENPX
KENP

8 个答案:

答案 0 :(得分:14)

$s =~ s/[^a-zA-Z].*$//;

从字面上看,找到第一个非alpha字符并从中删除所有内容。

答案 1 :(得分:6)

你用两种方式表达了请求:

  1. 从这些字符串的前面获取所有alpha字符
  2. 找到最后一个alpha字母并在
  3. 之后关闭所有内容

    虽然给出了样本字符串的结果是一样的,但我发现对正则表达式更加小心是值得的。所以,我将上面的第一项作为真正的要求,并将其写为:

    $str =~ s/^([a-z]*)[^a-z].*/$1/i;
    

    我的想法是,意外的字符串(如“7KENP989SD”)应该在替换后产生一个空字符串,而不是像“7KENP”那样的意外事件。当然,也许这就是你想要的......

答案 2 :(得分:5)

s/([A-Za-z]*).*/$1/

......会奏效。它不一定是最好的方式,但它是一般情况下的替换。

只有在您想要字母

时才有效

答案 3 :(得分:3)

s/\P{Alpha}.*//对我很有用:

perl -pe 's/\P{Alpha}.*//' <<EOF
KENP989SD
KENP913E
KENPX189R
KENP913
EOF

答案 4 :(得分:2)

也许这个:

s/(?<=^[A-Z]+).*//

使用look-behind将起始alphas后的所有内容替换为空白。


如有必要,添加一个不区分大小写的i标志:

s/(?<=^[A-Z]+).*//i

答案 5 :(得分:2)

注意:我认为Igor更有效率。

$str =~ s{^([A-Z]+).*}{$1};

为不区分大小写的匹配添加“i”标志

$str =~ s{^([A-Z]+).*}{$1}i;

答案 6 :(得分:2)

这是我的目标。

<强> / ^([A-ZA-Z] )。 $ /


编辑我比Igor更喜欢Igor的方法..


代码:

#!/usr/bin/perl
#
# http://stackoverflow.com/questions/507941/perl-regex-remove-all-characters-from-string-after-last-alpha-character
#
use strict;
use warnings;
for my $string (<DATA>){
    $string =~ /^([A-Za-z]*).*$/;
    print "$1\n";
}
__DATA__
KENP989SD
KENP913E
KENPX189R
KENP913

答案 7 :(得分:2)

如果您不需要修改输入行本身,我会多用一点:

my ( $alpha_prefix ) = ( $input_line =~ /^(\p{IsAlpha}*)/ );

在绝大多数情况下,我的大多数变量都是词汇,所以还有一些不会受到伤害并使我不能歪曲输入。另外,它通过了taint