【问题标题】:get line number within matcher.find() using matcher.start()使用 matcher.start() 在 matcher.find() 中获取行号
【发布时间】:2011-12-13 20:02:24
【问题描述】:

我正在使用while(matcher.find()) 循环并从文件中检索内容。我想知道如果我知道我发现的索引位于matcher.start(),我将如何从这个循环中获取行号。

我很困惑,谁能解释一下?

 String expr = "<[^<?!>]+>";
     String[] response = new String[5];

        Pattern p = Pattern.compile(expr);
        Matcher m = p.matcher(xmlDocument);
        while (m.find()) {
        //  System.out.println(m.group() + " located at " + m.start());
       //   txtMatches.append(m.group() + " located at " + m.start() + "\n");
            if (itemStack.getCount() == 0 && m.group().contains("</")) {
                response[0] = "Orphan closing tag" ; 
                response[1] = stripUnwantedChars(m.group(), true); 
                response[2] =  String.valueOf(m.start()); //right here is where i want to return line number
                return response; 
            }
        //rest of code

itemStack 是一堆推送的匹配项,然后我将它们进行比较以查看堆栈中是否没有更多项目但有一个带有结束标记的匹配项。

【问题讨论】:

  • 您是为每一行构建一个单独的匹配器,还是为文件的全部内容构建一个匹配器,或者其他什么?一些代码会很好。
  • 每行没有单独的匹配器。现在一个用于整个文件。并循环使用此 regex = "]+>" 查找所有文本让我看看是否可以简化一些代码以发布

标签: java regex matcher


【解决方案1】:

你需要单独创建一个索引数组,每行开始的索引,然后你可以使用这个数组和start()返回的索引来确定你的匹配在哪一行。该行索引数组的二进制搜索会做得很好。实际上,您也可以通过使用匹配行尾的正则表达式(仅匹配 '\n' 即可)然后从下一个字符开始每一行来创建此行索引列表。

【讨论】:

  • 感谢欧内斯特,但我不太明白,我发布了一些代码以更好地解释我想要做什么。
  • 在运行上述代码之前,运行一些类似的代码来查找文件中的所有行结尾。将它们的文件索引保存在列表或数组中。现在您有了每行的第一个字符偏移量的列表。然后,当您在上面运行代码时,您调用 matcher.start() 来获取偏移量并且您想知道行号,您只需搜索该数组,直到找到小于您的偏移量的最大条目。该条目的索引是行号。真的没有其他方法可以做到这一点!
  • 好的,谢谢你已经确认了我要尝试的内容。谢谢!
【解决方案2】:

您可以使用反向方法通过创建一个从 0 到 start() 返回的字符号的区域来获取行号。

例如,

class MatchTest {
public static void main(String...args) {
    try {
        FileInputStream fis = new FileInputStream("source.txt");
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        String data = new String(buffer);
        fis.close();


        Pattern pattern = Pattern.compile(args[0]);
        Matcher matcher = pattern.matcher(data);
        while(matcher.find()) {
            out.println(matcher.group());
            out.println(getLine(data, matcher.start()));


        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

static int getLine(String data, int start) {
    int line = 1;
    Pattern pattern = Pattern.compile("\n");
    Matcher matcher = pattern.matcher(data);
    matcher.region(0, start);
    while(matcher.find()) {
        line++;
    }
    return(line);
}

}

这里,getLine 方法将返回行号。

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 2014-07-28
    • 2016-02-24
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多