[英]Regex to capture comma separated groups of text in parentheses [Java]
我有一個包含一個或多個(逗號分隔)值的字符串,用引號括起來並用括號括起來。 所以它可以是os IN ('WIN', 'MAC', 'LNU')
(用於多個值)或只是os IN ('WIN')
用於單個值。
我需要提取List
中的值。
我已經嘗試過這個正則表達式,但它將所有值作為一個完整的字符串捕獲到一個列表元素中,如'WIN', 'MAC'
,而不是WIN
和MAC
的兩個字符串值 -
List<String> matchList = new ArrayList<>();
Pattern regex = Pattern.compile("\\((.+?)\\)");
Matcher regexMatcher = regex.matcher(processedFilterString);
while (regexMatcher.find()) {//Finds Matching Pattern in String
matchList.add(regexMatcher.group(1));//Fetching Group from String
}
結果:
Input: os IN ('WIN', 'MAC')
Output:
['WIN', 'MAC']
length: 1
在目前的形式中,正則表達式匹配一個或多個用括號括起來的字符並將它們捕獲在一個組中,這可能就是結果只是一個字符串的原因。 如何調整它以分別捕獲每個值?
編輯 - 只需添加更多細節。 輸入字符串可以有多個包含其他條件的 IN 子句,例如id IN ('xxxxxx') AND os IN ('WIN', 'MAC')
。 另外,匹配字符的長度不一定相同,可以是os IN ('WIN', 'MAC', 'LNUX')
。
您可以嘗試從IN
子句中拆分 CSV 字符串:
List<String> matchList = null;
Pattern regex = Pattern.compile("\\((.+?)\\)");
Matcher regexMatcher = regex.matcher(processedFilterString);
if (regexMatcher.find()) {
String match = regexMatcher.group(1).replaceAll("^'|'$", "");
String[] terms = match.split("'\\s*,\\s*'");
matchList = Arrays.stream(terms).collect(Collectors.toList());
}
請注意,如果您的輸入字符串可能包含多個IN
子句,則需要修改上述內容以使用while
循環。
我從您問題中的示例中看到,您的正則表達式需要找到包含在單引號中的至少三個大寫字母的字符串。
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Solution {
public static void main(String[] args) {
String s = "os IN ('WIN', 'MAC', 'LNUX')";
Pattern pattern = Pattern.compile("'([A-Z]{3,})'");
Matcher matcher = pattern.matcher(s);
List<String> list = new ArrayList<>();
while (matcher.find()) {
list.add(matcher.group(1));
}
System.out.println(list);
}
}
運行上述代碼會生成以下 output:
[WIN, MAC, LNUX]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.