1

我有以下格式的字符串:

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

所以重复模式是?|?+,我不知道会有多少。我要提取的部分是 |...之前的部分,因此对于我的示例,我想提取一个列表(例如 ArrayList),其中将包含:

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

我尝试了以下模式:

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

但这不按我想要的方式工作?有什么建议么?

4

4 回答 4

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]

注意?中间的,这可以防止正则表达式的第二部分消耗整个字符串,因为它使* 惰性而不是贪婪

于 2012-07-22T09:08:26.263 回答
1

您正在使用任何字符 ( .),其中包括|so,解析器继续咀嚼所有内容,一旦完成任何字符,它就会查找|,但什么都没有了。

所以,尝试匹配任何字符,但 |像这样:

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

如果合适,请确保您的全部--| 是在字符串的开头 using^并且在字符串的末尾有一个 + with $

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

更新: Tim Pietzcker 提出了一个很好的观点:因为在找到 a 之前您已经在匹配|,所以您也可以匹配字符串的其余部分并完成它:

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

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

myString.split("\\|")[0]
于 2012-07-22T08:56:30.630 回答
1

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

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?<=^|[+])[^|]+");
Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
于 2012-07-22T09:12:44.960 回答
0

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

于 2012-07-22T09:11:35.133 回答