2011-06-14 22 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)