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

#java #regex #multiline #records

#java #регулярное выражение #многострочный #записи

Вопрос:

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

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

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

 LABEL ...
...
...
  

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

Комментарии:

1. Я бы сказал, что построчный подход был бы быстрее. Особенно, если файл становится большим.

2. Не знаю, имеет ли это значение, но этот пример Ideone может показать, какой из них лучше (оказывается, StartsWith).

3. Спасибо. Если вы скопируете его в качестве ответа, оно определенно заслуживает 1 (или больше), как и все остальные ответы. 🙂

Ответ №1:

Для перебора всех 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 соответствует буквенным символам
  • .*? лениво сопоставляет все символы вплоть до…
  • точка, в которой предварительный просмотр (?=^LABEL|\Z) может утверждать, что то, что следует, является следующим LABEL или концом строки

Ответ №2:

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

 ^LABELs*w*
  

или

 ^LABEL.*
  

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

Ответ №3:

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

 (?=^LABEL).*
  

ДЕМОНСТРАЦИЯ

Ответ №4:

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

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

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

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