首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用matcher.start()获取matcher.find()中的行号

使用matcher.start()获取matcher.find()中的行号
EN

Stack Overflow用户
提问于 2011-10-24 11:17:57
回答 2查看 3.4K关注 0票数 2

我正在使用while(matcher.find())遍历和检索文件中的内容。我想知道如果我知道我找到的内容的索引是matcher.start(),我如何从这个循环中获得行号。

我糊涂了,有没有人能解释一下?

代码语言:javascript
复制
 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是一堆推送的匹配项,然后我会对它们进行比较,以查看堆栈中是否没有更多的项,但是否存在带有结束标记的匹配项。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-24 11:22:39

您需要单独创建每行开始处的索引数组,然后可以将此数组与start()返回的索引一起使用,以确定匹配的是哪一行。对行索引数组进行二进制搜索会很好。实际上,您也可以通过使用与行尾匹配的正则表达式(只匹配'\n‘就可以了),然后从下一个字符开始每一行,来创建这个行索引列表。

票数 3
EN

Stack Overflow用户

发布于 2014-10-11 20:07:28

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

例如,

代码语言:javascript
复制
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方法将返回行号。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7871007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档