的零件數量我可能有一個字符串,這將是這個樣子:取出string部分字符串
ABC
DEF-123
456
789GH-IJK-0
和IM試圖找出一個正則表達式那會在字符串和數字,這樣的組吧:
(ABC)
(DEF-)(123)
(456)
(789)(GH-IJK-)(0)
我首先想到的是使用(\ d * | \ d *)的模式,但數字心不是返回
的零件數量我可能有一個字符串,這將是這個樣子:取出string部分字符串
ABC
DEF-123
456
789GH-IJK-0
和IM試圖找出一個正則表達式那會在字符串和數字,這樣的組吧:
(ABC)
(DEF-)(123)
(456)
(789)(GH-IJK-)(0)
我首先想到的是使用(\ d * | \ d *)的模式,但數字心不是返回
如何使用內部非捕獲子組...
在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
使用+而不是*的選擇:
(\D+|\d+)
不,這將匹配任何東西,你說的匹配任何數字或非數字不止一個。這就像是說。+ – 2011-06-14 12:12:37
我測試了調節器(.NET)中的模式,並且它產生了正確的結果。 – lnmx 2011-06-14 12:29:58
@Inmx:我編輯了你的答案,以便我可以刪除我的貶低票。我的道歉和+1。 – 2011-06-14 12:46:02
這似乎是工作,但相當難看(反斜槓瘟疫) 。而不是做一個正則表達式,把它分成兩個,一個處理數字和一個處理字符。
$ sed 's/\([a-zA-Z-]\+\)/(\1)/g ; s/\([0-9]\+\)/(\1)/g' input
(BC)
(DEF-)(123)
(456)
(789)(GH-IJK-)(0)
如果你改變了'''到+'它應該工作 – mhyfritz 2011-06-14 12:06:44
@mhyfritz:沒有,那麼這將成爲完全一樣+ – 2011-06-14 12:13:23
@Andrew白:這兩個'+'和'|'是貪婪,所以它會工作。在python're.findall(r'(\ D + | \ d +)','789GH-IJK-0')給出'['789','GH-IJK-','0']' for ... – mhyfritz 2011-06-14 12:29:13