如何区分此字符串与Matcher和Pattern类?
我试过这个
String question="A: this is data i want first B: this is data i want second C: this is data i want third A: this is data i want first B: this is data i want second C: this is data i want third ";
Pattern pattern = Pattern.compile("A:(.*?)B:(.*?)C:(.*?)A:", Pattern.DOTALL | Pattern.MULTILINE);
Matcher m = pattern.matcher(question);
while (m.find()) {
m.group(1);
m.group(2);
m.group(3);
}
答案 0 :(得分:0)
如果你找不到更好的答案,这有点像黑客,但是有效:
使用此正则表达式:
A:(.*?)B:(.*?)C:(.*?)(?=A:)
但是您必须在字符串中附加分隔符(问题变量):
Matcher m = pattern.matcher(question + "A:");
与println一起使用:
while (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
}
输出:
这是我想要的数据 这是我想要的数据 这是我想要的第三个数据 这是我想要的数据 这是我想要的数据 这是我想要的第三个数据
答案 1 :(得分:0)
由于这需要上下文,您可以使用ANTLR之类的解析器,也可以编写自己的解决方案。
我会选择类似的东西:
SplitterStringMatcher matcher = new SplitterStringMatcher {
private char delimiter = 'A';
// return the count of characters matched, 0 if none
@Override public int matches(String str, int pos) {
if (str.length() > pos + 1
&& str.charAt(pos) == delimiter
&& str.charAt(pos + 1) == ':') {
if (++delimiter == 'D') { delimiter = 'A'; }
return 2;
}
return 0;
}
}
String[] strs = Splitter.split(question, matcher);
然后实现Splitter
...它必须在每个位置拆分输入matches()
返回大于0的值并跳过返回的字符数。
您还可以改进匹配器以在分隔符字母之前和':'
之后匹配空格。