Регулярное выражение для конца строки

Я пытаюсь разобрать файл GEDCOM, используя регулярные выражения, и почти готов, но выражение захватывает следующую строку текста для строк, в которых есть необязательный текст в конце строки. Каждая запись должна быть отдельной строкой.

Это выдержка из файла:

0 HEAD
1 CHAR UTF-8
1 SOUR Ancestry.com Family Trees
2 VERS (2010.3)
2 NAME Ancestry.com Family Trees
2 CORP Ancestry.com
1 GEDC
2 VERS 5.5
2 FORM LINEAGE-LINKED
0 @P6@ INDI 
1 BIRT 

и это регулярное выражение, которое я использую:

(\d+)\s+(@\S+@)?\s*(\S+)\s+(.*)

Это работает для всех строк, кроме тех, которые не содержат текста в конце, например, для первой. Например, последняя группа захвата для первой записи содержит «1 CHAR UTF-8».

Вот снимок экрана с сайта regex101.com, показывающий, как фиолетовая группа захвата перетекает в следующую строку:

Снимок экрана Regex101

Я попытался использовать квалификатор $, чтобы ограничить. * Только концами строки, но это не удалось, поскольку вторая строка также является концом строки.

Любая помощь будет принята с благодарностью.

Дэйв


person Magic Bullet Dave    schedule 13.02.2017    source источник
comment
\s соответствует символам новой строки, попробуйте заменить его обычным пробелом или [^\S\r\n] (или \h, если это PCRE). См. regex101.com/r/N2ZWWo/1 (с многострочным параметром добавляется ^, тоже).   -  person Wiktor Stribiżew    schedule 13.02.2017
comment
Большое спасибо Виктору, если вы хотите создать ответ, отмечу как лучший. Кажется, это помогает: (\ d +) + (@ \ S + @)? (\ S +) * (.)   -  person Magic Bullet Dave    schedule 13.02.2017
comment
.* по умолчанию является жадным и будет соответствовать как можно большему количеству совпадений. Попробуйте .*?$ сделать это совпадение нежадным.   -  person phuzi    schedule 13.02.2017


Ответы (1)


Шаблон \s соответствует символам новой строки. Замените его обычным пробелом, или [^\S\r\n], или \h, если это PCRE, или [\p{Zs}\t].

(\d+) +(@\S+@)? *(\S+) +(.*)

См. демонстрацию регулярного выражения

Если вам нужно сопоставить линии, вы можете добавить многострочную опцию и добавить якоря (^ в начале и $ в конце рисунка) с обеих сторон (см. другая демонстрация).

person Wiktor Stribiżew    schedule 13.02.2017