Я пытаюсь разобрать файл 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, показывающий, как фиолетовая группа захвата перетекает в следующую строку:
Я попытался использовать квалификатор $, чтобы ограничить. * Только концами строки, но это не удалось, поскольку вторая строка также является концом строки.
Любая помощь будет принята с благодарностью.
Дэйв
\s
соответствует символам новой строки, попробуйте заменить его обычным пробелом или[^\S\r\n]
(или\h
, если это PCRE). См. regex101.com/r/N2ZWWo/1 (с многострочным параметром добавляется^
, тоже). - person Wiktor Stribiżew   schedule 13.02.2017.*
по умолчанию является жадным и будет соответствовать как можно большему количеству совпадений. Попробуйте.*?$
сделать это совпадение нежадным. - person phuzi   schedule 13.02.2017