我有以下格式的字符串:
String name = "A|DescA+B|DescB+C|DescC+...X|DescX+"
所以重复模式是?|?+,我不知道会有多少。我要提取的部分是 |...之前的部分,因此对于我的示例,我想提取一个列表(例如 ArrayList),其中将包含:
[A, B, C, ... X]
我尝试了以下模式:
(.+)\\|.*\\+
但这不按我想要的方式工作?有什么建议么?
我有以下格式的字符串:
String name = "A|DescA+B|DescB+C|DescC+...X|DescX+"
所以重复模式是?|?+,我不知道会有多少。我要提取的部分是 |...之前的部分,因此对于我的示例,我想提取一个列表(例如 ArrayList),其中将包含:
[A, B, C, ... X]
我尝试了以下模式:
(.+)\\|.*\\+
但这不按我想要的方式工作?有什么建议么?
要将其转换为列表,您可以这样做:
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]
注意?
中间的,这可以防止正则表达式的第二部分消耗整个字符串,因为它使*
惰性而不是贪婪。
您正在使用任何字符 ( .
),其中包括|
so,解析器继续咀嚼所有内容,一旦完成任何字符,它就会查找|
,但什么都没有了。
所以,尝试匹配任何字符,但 |
像这样:
"([^|]+)\\|.*\\+"
如果合适,请确保您的全部--| 是在字符串的开头 using^
并且在字符串的末尾有一个 + with $
:
"^([^|]+)\\|.*\\+$"
更新: Tim Pietzcker 提出了一个很好的观点:因为在找到 a 之前您已经在匹配|
,所以您也可以匹配字符串的其余部分并完成它:
"^([^|]+).*\\+$"
UPDATE2:顺便说一句,如果你想简单地得到字符串的第一部分,你可以简化事情:
myString.split("\\|")[0]
另一个想法:查找+
(或字符串开头)和之间的所有字符|
:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?<=^|[+])[^|]+");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
我认为最简单的解决方案是拆分\\+
,然后为每个部分应用(.+?)\\|.*
模式以提取您需要的组。