我正在尝试从字符串中提取特定字符。我尝试过使用Split和replace来获取数据。但是还有其他的选择吗? 以下是输入字符串
Input1-
q={!tag=tagForType}(Type:(ABC))
Input2-
q={!tag=tagForType}(Type:(ABC OR XYZ))
列表格式需要输出。
Output1- List1{ABC}
Output2- List1{ABC ,XYZ)
以下是我尝试提取此类数据的代码
if (s.contains("Type")) {
List = s.split("Type:\\(");
String s1 = List[1].replaceAll("\\W", "");
List1 = s1.split("OR");
}
还有其他选择吗?
答案 0 :(得分:2)
使用正则表达式查看此解决方案。
String input = "q={!tag=tagForType}(Type:(ABC OR XyZ OR ORT))(Type:(ABC))";
Pattern findType = Pattern.compile("Type:(\\([ \\w]+\\))");
Pattern extractLists = Pattern.compile("(\\(| OR )([\\w]+)");
Matcher typeMatcher = findType.matcher(input);
while (typeMatcher.find()) {
System.out.println(typeMatcher.group(1));
Matcher listMatcher = extractLists.matcher(typeMatcher.group(1));
while (listMatcher.find()) {
System.out.println(listMatcher.group(2));
}
}
这将打印以下内容:
(ABC OR XYZ OR ORT)
ABC
XyZ
ORT
(ABC)
ABC
当然,您可能需要对这些群组做些其他事情,我目前只是将它们打印出来。
请注意,这里我演示了此解决方案如何在同一个字符串中使用多个Type:
,我认为您的解决方案无法处理。
目前我还假设部件之间的间隔数量是固定的,但如果使用正则表达式,这也可以处理。
答案 1 :(得分:0)
试试这个:
String EXAMPLE_TEST = "q={!tag=tagForType}(Type:(ABC))";
pattern = "^.*?Type:.*?([\\w\\s]+).*";
String updated = EXAMPLE_TEST.replaceAll(pattern, "$1" );
System.out.println(updated);
用OR分割
String[] split = updated.split(" OR ");
for(int i=0;i<split.length;i++)
System.out.println(split[i]);