2011-06-14 57 views
4

的零件數量我可能有一個字符串,這將是這個樣子:取出string部分字符串

ABC 
DEF-123 
456 
789GH-IJK-0 

和IM試圖找出一個正則表達式那會在字符串和數字,這樣的組吧:

(ABC) 
(DEF-)(123) 
(456) 
(789)(GH-IJK-)(0) 

我首先想到的是使用(\ d * | \ d *)的模式,但數字心不是返回

+2

如果你改變了'''到+'它應該工作 – mhyfritz 2011-06-14 12:06:44

+0

@mhyfritz:沒有,那麼這將成爲完全一樣+ – 2011-06-14 12:13:23

+1

@Andrew白:這兩個'+'和'|'是貪婪,所以它會工作。在python're.findall(r'(\ D + | \ d +)','789GH-IJK-0')給出'['789','GH-IJK-','0']' for ... – mhyfritz 2011-06-14 12:29:13

回答

4

如何使用內部非捕獲子組...

在Perl
((?:\D+)|(?:\d+)) 

輸出示例...

cat input | perl -ane 'chomp; print "looking at $_\n"; while(/((?:\D+)|(?:\d+))/g) {print "Found $1\n";}' 
looking at BC 
Found BC 
looking at DEF-123 
Found DEF- 
Found 123 
looking at 456 
Found 456 
looking at 789GH-IJK-0 
Found 789 
Found GH-IJK- 
Found 0 
2

使用+而不是*的選擇:

(\D+|\d+) 
+0

不,這將匹配任何東西,你說的匹配任何數字或非數字不止一個。這就像是說。+ – 2011-06-14 12:12:37

+0

我測試了調節器(.NET)中的模式,並且它產生了正確的結果。 – lnmx 2011-06-14 12:29:58

+0

@Inmx:我編輯了你的答案,以便我可以刪除我的貶低票。我的道歉和+1。 – 2011-06-14 12:46:02

0

這似乎是工作,但相當難看(反斜槓瘟疫) 。而不是做一個正則表達式,把它分成兩個,一個處理數字和一個處理字符。

$ sed 's/\([a-zA-Z-]\+\)/(\1)/g ; s/\([0-9]\+\)/(\1)/g' input 
(BC) 
(DEF-)(123) 
(456) 
(789)(GH-IJK-)(0)