2017-02-13 11 views
1

Я пытаюсь проанализировать файл 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, показывая, как фиолетовая группа захвата кровоточит на следующую строку:.

Regex101 screen shot

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

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

Dave

+1

'\ s' соответствует новой строке, попробуйте заменить его на обычное пространство или' [^ \ S \ r \ n] '(или' \ h', если это PCRE). См. Https://regex101.com/r/N2ZWWo/1 (добавляется '^' с многострочной опцией). –

+0

Огромное спасибо Wiktor, если вы хотите создать ответ, я буду отмечать как можно лучше. Это похоже на трюк: (\ d +) + (@ \ S + @)? * (\ S +) * (. *) –

+0

'. *' Жадно по умолчанию и будет соответствовать столько, сколько может. Попробуйте '. *? $' Сделать это не жадным совпадением. – phuzi

ответ

1

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

(\d+) +(@\[email protected])? *(\S+) +(.*) 

Смотрите regex demo

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

 Смежные вопросы

  • Нет связанных вопросов^_^