получить номер строки в matcher.find () с помощью matcher.start () - PullRequest
2 голосов
/ 24 октября 2011

Я использую 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 - это стек выдвинутых совпадений, а затем я сравниваю их, чтобы увидеть, нет ли в стеке больше элементов, но есть совпадение с закрывающим тегом.

Ответы [ 2 ]

2 голосов
/ 11 октября 2014

Вы можете использовать обратный метод для получения номера строки путем создания области от 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 возвращает номер строки.

2 голосов
/ 24 октября 2011

Вам нужно отдельно создать массив индексов, где начинается каждая строка, а затем вы можете использовать этот массив вместе с индексом, возвращаемым start(), чтобы выяснить, на какой строке находится ваше совпадение.Бинарный поиск этого массива индекса строки будет хорошо работать.Вы могли бы на самом деле создать этот список индексов строк, также используя регулярное выражение, совпадающее с концом строки (для этого достаточно было бы просто '\ n'), а затем начиная каждую строку со следующего символа.

...