如果不是某些情况,这会更容易。
示例数据:
KENP989SD
KENP913E
KENPX189R
KENP913
我可以用什么正则表达式从第一个非alpha字符开始删除字符串中的所有字符?基本上,我想找到第一个非alpha字符,然后在不管char类型的情况下切断所有内容。
应用正则表达式后,这些数据应为:
KENP
KENP
KENPX
KENP
答案 0 :(得分:14)
$s =~ s/[^a-zA-Z].*$//;
从字面上看,找到第一个非alpha字符并从中删除所有内容。
答案 1 :(得分:6)
你用两种方式表达了请求:
虽然给出了样本字符串的结果是一样的,但我发现对正则表达式更加小心是值得的。所以,我将上面的第一项作为真正的要求,并将其写为:
$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。