的零件数量我可能有一个字符串,这将是这个样子:取出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