[英]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.