,我有以下格式的字符串:Java的正则表达式模式匹配
String name = "A|DescA+B|DescB+C|DescC+...X|DescX+"
所以重复的图案是| +,我不知道有多少会出现?我想提取的部分是之前的部分| ...所以我的例子,我要解开一个列表(例如一个ArrayList)将包含:
[A, B, C, ... X]
我曾尝试以下方式:
(.+)\\|.*\\+
但这不符合我的要求?有什么建议么?
,我有以下格式的字符串:Java的正则表达式模式匹配
String name = "A|DescA+B|DescB+C|DescC+...X|DescX+"
所以重复的图案是| +,我不知道有多少会出现?我想提取的部分是之前的部分| ...所以我的例子,我要解开一个列表(例如一个ArrayList)将包含:
[A, B, C, ... X]
我曾尝试以下方式:
(.+)\\|.*\\+
但这不符合我的要求?有什么建议么?
你消耗任何字符(.
)和包括|
因此,分析器继续大嚼一切,一旦它拍完任何字符,它看起来|
,但什么都不剩。
所以,尽量匹配任何字符但|
这样的:
"([^|]+)\\|.*\\+"
如果它适合,请确保您的所有 - 丁 - |在使用^
字符串的开头,有在字符串的结尾与$
是一个+:
"^([^|]+)\\|.*\\+$"
UPDATE:蒂姆Pietzcker使得一个好点:既然你已经匹配,直到找到一个|
,你也可以同样匹配字符串的其余部分,并用它做:
"^([^|]+).*\\+$"
UPDATE2:顺便说一句,如果你想简单地得到该字符串的第一部分,你可以简化事情:
myString.split("\\|")[0]
转换成一个列表这个,你可以这样做:
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]
注意?
在中间,阻止的第二部分正则表达式消耗整个字符串,因为它使得*
延迟而不是贪婪。
我认为最简单的解决方案是分割\\+
,然后为每个部分应用(.+?)\\|.*
模式来提取您需要的组。
是的,我想到了,但我也需要验证字符串是否具有该格式...所以我想用纯正则表达式来做。 – Veles 2012-07-22 09:12:58
另一个想法:找到+
之间的所有字符(或字符串的开始)和|
:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?<=^|[+])[^|]+");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
其实,你可以放下'\\ |'(如果有至少一个'|'在串)。 – 2012-07-22 09:01:37
@TimPietzcker好点!添加到其他答案 – Miquel 2012-07-22 09:04:29