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