2017-05-16 38 views
1

“5:无效的号码:123 *** 345”如何让Java的正则表达式匹配器匹配鉴于这样的错误消息的分隔符

我想消息拆分为error_codeerror_text。在这种情况下,我想要5Invalid number : 123***345

然而,这段代码拆分成匹配 5 : Invalid number123***345

这意味着正则表达式匹配上次:

Pattern PROCESSOR_ERROR_INFO_PATTERN_ONE = Pattern.compile("(.*):(.*)"); 

Matcher matcherOne = PROCESSOR_ERROR_INFO_PATTERN_ONE.matcher(error_message); 

if (matcherOne.matches()) { 
     processorErrorCode = matcherOne.group(1).trim(); 
     processorErrorMessage = matcherOne.group(2).trim(); 
} 

顺便说一下,不能保证error_code只是数字。所以我不能使用正则表达式,如(\\d+):(.*) 有没有一种方法可以控制匹配第一个:而不是默认的最后一个:

回答

2

您可以通过添加一个?使第一*量词,所以第一组将尽可能小:

Pattern.compile("(.*?):(.*)") 
+0

很好的回答。在旁注中,Oracle教程将其称为不情愿的量词:https://docs.oracle.com/javase/tutorial/essential/regex/quant.html –

2

那么你可以只使用split(String, int))限制为2.这将是最简单的。如果您想坚持您的解决方案,可以通过更改量词的贪婪性(.*?)或匹配:(如([^:]*):(.*))之类的所有内容来匹配第一个:而不是最后一个: