Я пытаюсь проанализировать файл 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 @[email protected] INDI
1 BIRT
и это регулярное выражение, я использую:
(\d+)\s+(@\[email protected])?\s*(\S+)\s+(.*)
Это работает для всех линий, за исключением тех, которые не содержат какой-либо текст в конец, такой как первый. Например, последняя группа захвата для первой записи содержит «1 CHAR UTF-8».
Вот снимок экрана с regex101.com, показывая, как фиолетовая группа захвата кровоточит на следующую строку:.
Я попытался с помощью $ спецификатора ограничить * до нескольких строк заканчиваются , но это не удается, так как вторая строка также является концом строки.
Любая помощь была бы принята с благодарностью.
Dave
'\ s' соответствует новой строке, попробуйте заменить его на обычное пространство или' [^ \ S \ r \ n] '(или' \ h', если это PCRE). См. Https://regex101.com/r/N2ZWWo/1 (добавляется '^' с многострочной опцией). –
Огромное спасибо Wiktor, если вы хотите создать ответ, я буду отмечать как можно лучше. Это похоже на трюк: (\ d +) + (@ \ S + @)? * (\ S +) * (. *) –
'. *' Жадно по умолчанию и будет соответствовать столько, сколько может. Попробуйте '. *? $' Сделать это не жадным совпадением. – phuzi