Ниже приведен пример списка многострочных записей, каждый из которых начинается с фиксированной строковой метки (LABEL
):
<Irrelevant line>
...
<Irrelevant line>
LABEL ...
...
...
LABEL ...
...
...
LABEL ...
...
...
LABEL ...
...
...
Есть ли регулярное выражение Java, которое может значительно превышать и извлекать каждую запись, т.е.
LABEL ...
...
...
Кроме того, является ли это самым быстрым способом извлечения этих записей, или чтение по очереди и проверка начала строки приведет к более быстрым результатам?
Чтобы перебрать все группы 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
или конец строкиЯ думаю, вы можете начать с выражения:
^LABEL\s*\w*
ИЛИ
^LABEL.*
Это может потребовать некоторых улучшений, но вы можете хотя бы начать с него.
С моей точки зрения, вы можете перебирать поток на линию и проверять, начинается ли строка с "LABEL".
Я думаю, вы можете использовать метод подстроки, например
line.substring(0,"LABLEL".length());//you need add more checks to improve code security
С моей точки зрения, Regural Expressions очень полезны для поиска шаблона без определенного текста.