2016-09-01 2 views
0

Я новый программист на C#. Я пытаюсь сделать простой C# приложение, которое будет извлекать заголовки из PDF-файла (книги), если они находятся в таком формате:Regex для многострочного заголовка C#

1.1 ЭЛЕКТРИЧЕСКОЙ/ЭЛЕКТРОНИКА ПРОМЫШЛЕННАЯ

1.2 Краткая история

1,3 ЕДИНИЦЫ ИЗМЕРЕНИЯ

Я использую код:

string pattern = @"(\d+)(\.)(\d+) ([A-Z]+).([A-Z]+).([A-Z]+).([A-Z]+).([A-Z]+)"; 
Regex.match(strText,pattern); 

, который отлично работает для однострочных заголовков, но не работает для двух линейных/многострочных заголовков. Может ли кто-нибудь помочь?

+0

Вы говорите оглавление или что-то в этом роде? Вы никогда не будете получать регулярное выражение, если вы рассмотрите весь текст книги как одну строку и запустите регулярное выражение один раз. Вы подберете много ложных срабатываний и, вероятно, тоже пропустите. – SledgeHammer

+0

Это регулярное выражение не делает то, что вы думаете, что оно делает. Например, он будет соответствовать строке 'XYZ1.2 A BRIEF HISTORY' и не будет соответствовать строке' 2.4 SUMMARY'. Я рекомендую вам найти несколько руководств по регулярным выражениям (но ** не ** спрашивайте здесь, как это явно не относится к теме). – AdrianHHH

+0

Да, я говорю обо всем тексте книги. Я выбираю его, потому что он хорошо отформатирован.Кажется, работает, но да есть некоторые незначительные проблемы, которые, я думаю, могут быть решены, @SledgeHammer – rabinmallick

ответ

0

Я не знаком с регулярным выражением стиля C#, но не является ли . символом (кроме новой строки)?

Если вам нужны новые линии, вам также необходимо будет указать фактический \n в конце, возможно, с ?, если вы не планируете иметь альтернативу.

Но я удивлен, что это регулярное выражение не вызывает никаких проблем, если форматирование книги так не будет совершенным.

0

Предполагая, что вы уже получили нужную оглавление в одной строке, и единственная проблема заключается в анализе заголовков второго уровня.

Регулярное выражение, измененное для соответствия только заглавными буквами.

Вы можете достичь требуемого результата с помощью следующего кода:

string pattern = @"((\d+\.\d+) ([A-Z\s]+)\n)+"; 
    var match = Regex.Match(input, pattern); 

    var headers = new List<string>(); 
    for (var i = 0; i < match.Groups[1].Captures.Count; i++) 
    { 
     headers.Add(match.Groups[1].Captures[i].Value); 
    } 

И после того, как он headers будет содержать все необходимые данные.

Предполагая, что input содержит входные данные. Также обратите внимание, что \n - это новый символ линии.

Ваше регулярное выражение упрощено.

(\d+\.\d+) обозначает последовательность «один или несколько цифровых символов», точку, «один или несколько цифровых символов», пробел.

([A-Z\s]+)\n - «один или более заглавная буква или пробел», «символ новой строки»

Кроме того, прочитайте следующие article, чтобы ознакомиться с C# регулярных выражений.

+0

Привет, спасибо за ссылку и решение. Ваше решение ловит как столичные, так и маленькие буквы. Есть ли способ поймать только заглавные буквы? – rabinmallick

+0

@rabinmallick Я изменил регулярное выражение в ответе за сопоставление только заглавных букв и пробелов –

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