Java регулярное выражение для сопоставления многострочных записей, начиная с фиксированной метки

1

Ниже приведен пример списка многострочных записей, каждый из которых начинается с фиксированной строковой метки (LABEL):

<Irrelevant line>
...
<Irrelevant line>
LABEL ...
...
...
LABEL ...
...
...
LABEL ...
...
...
LABEL ...
...
...

Есть ли регулярное выражение Java, которое может значительно превышать и извлекать каждую запись, т.е.

LABEL ...
...
...

Кроме того, является ли это самым быстрым способом извлечения этих записей, или чтение по очереди и проверка начала строки приведет к более быстрым результатам?

  • 2
    Я бы сказал, что построчный подход будет быстрее. Особенно, если файл становится большим.
  • 0
    Да, скорее всего.
Показать ещё 2 комментария
Теги:
multiline
records

4 ответа

2
Лучший ответ

Чтобы перебрать все группы LABEL, используйте следующее:

Pattern regex = Pattern.compile("(?sm)LABEL.*?(?=^LABEL|\\Z)");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    // the current LABEL group: regexMatcher.group()
} 

См. Демонстрацию для различных матчей.

объяснение

  • (?s) активирует режим DOTALL, позволяя точке совпадать по линиям
  • (?m) включает многострочный режим, позволяя ^ и $ соответствовать каждой строке
  • LABEL соответствует буквальным символам
  • .*? лениво соответствует всем символам до...
  • точка, где lookahead (?=^LABEL|\\Z) может утверждать, что следующим является следующая LABEL или конец строки
  • 0
    Спасибо, рад, что это помогло. :)
2

Я думаю, вы можете начать с выражения:

^LABEL\s*\w*

ИЛИ

^LABEL.*

Это может потребовать некоторых улучшений, но вы можете хотя бы начать с него.

1

С моей точки зрения, вы можете перебирать поток на линию и проверять, начинается ли строка с "LABEL".

Я думаю, вы можете использовать метод подстроки, например

line.substring(0,"LABLEL".length());//you need add more checks to improve code security

С моей точки зрения, Regural Expressions очень полезны для поиска шаблона без определенного текста.

1

Ниже будут соответствовать все строки, начинающиеся со строки LABEL,

(?=^LABEL).*

DEMO

Ещё вопросы

Сообщество Overcoder
Наверх
Меню