Java регулярное выражение использовать один шаблон вместо двух - PullRequest
2 голосов
/ 14 июня 2019

У меня есть текстовый файл, который содержит строки, и некоторые из них имеют следующий формат:

  • 3 вкладки,
  • после нескольких слов и разрыва строки в конце.
  • Мне нужно поймать слова в этих строках, одно за другим (с указателем каждого слова в тексте).

Я думал о решении, использующем 2 шаблона регулярных выражений и 2 цикла (добавил код ниже), но я хотел бы знать, если есть лучшее решение, использующее только один шаблон регулярных выражений.

Вот пример для строк из текста:

            Hello I am studying regex!
            This is a line in the text.
                Don't need to add this line
        nor this line.
            But this line should be included.
Map<String, Integer> wordsMap = New HashMap<>();

Pattern p = Pattern.compile("\\t{3}(.*)\\n");
Matcher m = p.matcher(text);

Pattern p2 = Pattern.compile("(\S+)");
Matcher m2 = p.matcher(");

while(m.find()) {
    m2.reset(m.group(1));
    while(m2.find()) {
        wordsMap.add(m2.group(1), m.start(1) + m2.start(1));
    }
}

1 Ответ

1 голос
/ 14 июня 2019

Вы можете использовать

(?:\G(?!^)\h+|^\t{3})(\S+)

См. Демоверсию regex . Скомпилируйте шаблон с флагом Pattern.MULTILINE.

Получить данные группы 1.

информация

  • (?:\G(?!^)\h+|^\t{3}) - либо конец предыдущего матча, но не в начале строки, за которой следуют 1+ горизонтальных пробелов или три табуляции в начале строки
  • (\S+) - Группа 1: любые 1+ непробельных символов.

Java-демонстрация :

String s = "\t\t\tHello I am studying regex!\n\t\t\tThis is a line in the text.\n\t\t\t\tDon't need to add this line\n\t\tnor this line.\n\t\t\tBut this line should be included.";
Pattern pattern = Pattern.compile("(?:\\G(?!^)\\h+|^\t{3})(\\S+)", Pattern.MULTILINE);
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println("Match: '" + matcher.group(1) + "', Start: " + matcher.start(1)); 
} 

Выход:

Match: 'Hello', Start: 3
Match: 'I', Start: 9
Match: 'am', Start: 11
Match: 'studying', Start: 14
Match: 'regex!', Start: 23
Match: 'This', Start: 33
Match: 'is', Start: 38
Match: 'a', Start: 41
Match: 'line', Start: 43
Match: 'in', Start: 48
Match: 'the', Start: 51
Match: 'text.', Start: 55
Match: 'But', Start: 113
Match: 'this', Start: 117
Match: 'line', Start: 122
Match: 'should', Start: 127
Match: 'be', Start: 134
Match: 'included.', Start: 137
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...