java中的组和模式匹配

时间:2015-01-30 11:18:54

标签: java regex

如何区分此字符串与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);
}

2 个答案:

答案 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的值并跳过返回的字符数。

您还可以改进匹配器以在分隔符字母之前和':'之后匹配空格。