如果不是在某些情況下,這會更容易。如何從字符串中刪除所有字符,從第一個非字母字符開始?
的樣本數據:
KENP989SD
KENP913E
KENPX189R
KENP913
我可以使用哪些正則表達式,從開始的第一個非字母字符字符串中刪除所有字符?基本上,我希望找到第一個非alpha字符,然後將所有內容切掉,而不管字符類型如何。
應用正則表達式之後,這些數據應該是:
KENP
KENP
KENPX
KENP
如果不是在某些情況下,這會更容易。如何從字符串中刪除所有字符,從第一個非字母字符開始?
的樣本數據:
KENP989SD
KENP913E
KENPX189R
KENP913
我可以使用哪些正則表達式,從開始的第一個非字母字符字符串中刪除所有字符?基本上,我希望找到第一個非alpha字符,然後將所有內容切掉,而不管字符類型如何。
應用正則表達式之後,這些數據應該是:
KENP
KENP
KENPX
KENP
$s =~ s/[^a-zA-Z].*$//;
從字面上看,找到的第一個非字母字符和砍事事休,從它開始。
擺脫點 – 2009-02-03 17:13:01
在他的例子中,他在第一個非alpha字符串之後擺脫了所有的字符,並且最後並非所有非alpha字符。 – 2009-02-03 17:16:57
s/([A-Za-z]*).*/$1/
...會工作。這不一定是最好的方法,但它是一個普通的案例替換。
它只能如果你只是想字母字符
也許這:
s/(?<=^[A-Z]+).*//
用途看,身後的空白阿爾法開始後取代一切。
必要時添加I標誌不區分大小寫:
s/(?<=^[A-Z]+).*//i
注意:我認爲伊戈爾的效率更高。
$str =~ s{^([A-Z]+).*}{$1};
添加「i」標誌爲不區分大小寫的匹配
你措辭請求2種方式:
雖然結果與您的示例字符串相同,但我發現使用正則表達式時要小心謹慎。所以,我會採取的第一項以上的實際需求,並把它寫爲:
$str =~ s/^([a-z]*)[^a-z].*/$1/i;
在我腦海裏的優勢是意外的字符串(如「7KENP989SD」)應導致置換後一個空字符串,而不是像「7KENP」那樣出乎意料的東西。當然,也許這就是你想要的......
這是我的好去處。
/^([A-Za-z] )。 $/
編輯我喜歡伊戈爾的做法比我好..
代碼:
#!/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
如果您不需要修改輸入線本身,我多用一點:
my ($alpha_prefix) = ($input_line =~ /^(\p{IsAlpha}*)/);
絕大多數情況下,我的大部分變量都是詞彙,所以還有一些不會傷害我,並使我免於可能的歪曲輸入。另外,它通過taint。
s/\P{Alpha}.*//
作品對我罰款:
perl -pe 's/\P{Alpha}.*//' <<EOF
KENP989SD
KENP913E
KENPX189R
KENP913
EOF
所以基本上,你想讓它在* *第一個非阿爾法。對於'KENPX189R',在「最後一個字母」之後是「',因爲」最後一個字母「(在行上是'R'。 – Axeman 2009-02-03 21:23:51
是的,你的權利...虐待標題/ desc – CheeseConQueso 2009-02-03 21:31:17