2009-02-03 88 views
2

如果不是在某些情況下,這會更容易。如何從字符串中刪除所有字符,從第一個非字母字符開始?

的樣本數據:

KENP989SD 
KENP913E 
KENPX189R 
KENP913 

我可以使用哪些正則表達式,從開始的第一個非字母字符字符串中刪除所有字符?基本上,我希望找到第一個非alpha字符,然後將所有內容切掉,而不管字符類型如何。

應用正則表達式之後,這些數據應該是:

KENP 
KENP 
KENPX 
KENP 
+0

所以基本上,你想讓它在* *第一個非阿爾法。對於'KENPX189R',在「最後一個字母」之後是「',因爲」最後一個字母「(在行上是'R'。 – Axeman 2009-02-03 21:23:51

+0

是的,你的權利...虐待標題/ desc – CheeseConQueso 2009-02-03 21:31:17

回答

14

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

從字面上看,找到的第一個非字母字符和砍事事休,從它開始。

+0

擺脫點 – 2009-02-03 17:13:01

+0

在他的例子中,他在第一個非alpha字符串之後擺脫了所有的字符,並且最後並非所有非alpha字符。 – 2009-02-03 17:16:57

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

...會工作。這不一定是最好的方法,但它是一個普通的案例替換。

它只能如果你只是想字母字符

2

也許這:

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

用途看,身後的空白阿爾法開始後取代一切。


必要時添加I標誌不區分大小寫:

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

注意:我認爲伊戈爾的效率更高。

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

添加「i」標誌爲不區分大小寫的匹配

6

你措辭請求2種方式:

  1. 獲取所有的字母字符掉這些字符串
  2. 的前
  3. 找到最後一個字母字符並將所有東西都刪除後

雖然結果與您的示例字符串相同,但我發現使用正則表達式時要小心謹慎。所以,我會採取的第一項以上的實際需求,並把它寫爲:

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

在我腦海裏的優勢是意外的字符串(如「7KENP989SD」)應導致置換後一個空字符串,而不是像「7KENP」那樣出乎意料的東西。當然,也許這就是你想要的......

2

這是我的好去處。

/^([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 
2

如果您不需要修改輸入線本身,我多用一點:

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

絕大多數情況下,我的大部分變量都是詞彙,所以還有一些不會傷害我,並使我免於可能的歪曲輸入。另外,它通過taint

3

s/\P{Alpha}.*//作品對我罰款:

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