[英]Java regex pattern matcher
我有以下格式的字符串:
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]
注意?
在中間,這樣可以防止正則表達式的第二部分占用整個字符串,因為它使*
惰性,而不是greedy 。
您正在使用任何字符( .
),其中包括|
因此,解析器會繼續用力嚼所有內容,一旦完成獲取任何字符的操作,它就會尋找|
,但是什么都沒有了。
因此,嘗試匹配除 |
任何字符|
像這樣:
"([^|]+)\\|.*\\+"
並且如果適合,請確保您的所有| 在使用^
的字符串的開頭,在使用$
的字符串的結尾有一個+:
"^([^|]+)\\|.*\\+$"
更新:蒂姆·皮茨克(Tim Pietzcker)提出了一個很好的觀點:由於您已經匹配了,直到找到|
,您也可以匹配其余字符串並完成操作:
"^([^|]+).*\\+$"
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());
}
我認為最簡單的解決方案是用\\\\+
分割,然后對每個部分應用(.+?)\\\\|.*
模式提取所需的組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.