2012-07-22 51 views
1

,我有以下格式的字符串:Java的正则表达式模式匹配

String name = "A|DescA+B|DescB+C|DescC+...X|DescX+" 

所以重复的图案是| +,我不知道有多少会出现?我想提取的部分是之前的部分| ...所以我的例子,我要解开一个列表(例如一个ArrayList)将包含:

[A, B, C, ... X] 

我曾尝试以下方式:

(.+)\\|.*\\+ 

但这不符合我的要求?有什么建议么?

回答

1

你消耗任何字符(.)和包括|因此,分析器继续大嚼一切,一旦它拍完任何字符,它看起来|,但什么都不剩。

所以,尽量匹配任何字符|这样的:

"([^|]+)\\|.*\\+" 

如果它适合,请确保您的所有 - 丁 - |在使用^字符串的开头,有在字符串的结尾与$是一个+:

"^([^|]+)\\|.*\\+$" 

UPDATE:蒂姆Pietzcker使得一个好点:既然你已经匹配,直到找到一个|,你也可以同样匹配字符串的其余部分,并用它做:

"^([^|]+).*\\+$" 

UPDATE2:顺便说一句,如果你想简单地得到该字符串的第一部分,你可以简化事情:

myString.split("\\|")[0] 
+0

其实,你可以放下'\\ |'(如果有至少一个'|'在串)。 – 2012-07-22 09:01:37

+0

@TimPietzcker好点!添加到其他答案 – Miquel 2012-07-22 09:04:29

3

转换成一个列表这个,你可以这样做:

String name = "A|DescA+B|DescB+C|DescC+X|DescX+"; 
Matcher m = Pattern.compile("([^|]+)\\|.*?\\+").matcher(name); 
List<String> matches = new ArrayList<String>(); 
while (m.find()) { 
    matches.add(m.group(1)); 
} 

这给你一个列表:

[A, B, C, X] 

注意?在中间,阻止的第二部分正则表达式消耗整个字符串,因为它使得*延迟而不是贪婪

0

我认为最简单的解决方案是分割\\+,然后为每个部分应用(.+?)\\|.*模式来提取您需要的组。

+0

是的,我想到了,但我也需要验证字符串是否具有该格式...所以我想用纯正则表达式来做。 – Veles 2012-07-22 09:12:58

1

另一个想法:找到+之间的所有字符(或字符串的开始)和|

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile("(?<=^|[+])[^|]+"); 
Matcher regexMatcher = regex.matcher(subjectString); 
    while (regexMatcher.find()) { 
     matchList.add(regexMatcher.group()); 
    }