2011-06-29 51 views
1

我在粗糙形式几个字符串:Regex的静态组问题

[一些号码与一个或2位数] [一些文本] [文本是ABC或BC] [一些文本]

String test = "12testABCtest"; 
Pattern p = Pattern.compile("([\\d]{1,2})([\\w]*)(ABC|BC)([\\w]*)"); 

但它给我的总是“BC在第三组,而不是ABC(因为它包含一个以前组)

你有任何想法,该怎么办呢?

谢谢,

+4

而不是'[\\ d]'你可以写'\\ d',对于'\\ w'也是。 '(ABC | BC)'可以写成'(A?BC)'。 – Qtax

回答

8

可以使文本匹配非贪婪:

Pattern p = Pattern.compile("([\\d]{1,2})([\\w]*?)(A?BC)([\\w]*)"); 

参考:

Reluctant quantifiers 
----------------------------- 
X??  X, once or not at all 
X*?  X, zero or more times 
X+?  X, one or more times 

来源:Pattern javadoc: Reluctant quantifiers

基本上是:不愿意量词会少匹配可能的,而不是默认的贪婪量词,它将与possi一样多BLE。通过将?添加到另一个量词,可以得到一个不情愿的量词。