[英]Match all occurrences Regex Java
我想使用Regex Java API識別字符串的所有“單詞-數字-單詞”序列。
例如,如果我有“ ABC-122-JDHFHG-456-MKJD”,則需要輸出:[ABC-122-JDHFHG,JDHFHG-456-MKJD]。
String test = "ABC-122-JDHFHG-456-MKJD";
Matcher m = Pattern.compile("(([A-Z]+)-([0-9]+)-([A-Z]+))+")
.matcher(test);
while (m.find()) {
System.out.println(m.group());
}
上面的代碼僅返回“ ABC-122-JDHFHG”。
有任何想法嗎 ?
最后一個([AZ]+)
匹配並使用JDHFHG
,因此正則表達式引擎僅在第一個匹配后“看到” -456-MKJD
,並且模式與此剩余字符串不匹配。
您想獲得“整個單詞”重疊匹配。
采用
String test = "ABC-122-JDHFHG-456-MKJD";
Matcher m = Pattern.compile("(?=\\b([A-Z]+-[0-9]+-[A-Z]+)\\b)")
.matcher(test);
while (m.find()) {
System.out.println(m.group(1));
} // => [ ABC-122-JDHFHG, JDHFHG-456-MKJD ]
參見Java演示
圖案細節
(?=
-正向超前的開始位置,該位置與緊隨其后的位置相匹配
\\\\b
單詞邊界 (
-捕獲組的開始(以便能夠獲取您需要的值) [AZ]+
-1+ ASCII大寫字母 -
連字符 [0-9]+
-1+個數字 -
連字符 [AZ]+
-1+ ASCII大寫字母 )
-捕獲組的結尾 \\\\b
單詞邊界 )
-超前構造的結尾。 在這里,您要重疊最后一個單詞。
從捕獲組1中制作一個陣列。
基本上,找到3個消耗2。這使下一個比賽位置開始
在下一個可能的已知單詞上。
(?=(([AZ]+-\\d+-)[AZ]+))\\2
https://regex101.com/r/Sl5FgT/1
格式化
(?= # Assert to find
( # (1 start), word,num,word
( # (2 start), word,num
[A-Z]+
-
\d+
-
) # (2 end)
[A-Z]+
) # (1 end)
)
\2 # Consume word,num
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.