2013-07-10 4 views
0

Итак, я пытаюсь разобрать файл с несколькими «нижними колонтитулами» (файл представляет собой вывод, который был предназначен для печати, который моя компания хочет сохранить в электронном виде ... каждый нижний колонтитул это новая страница, и новая страница больше не нужна).Regex Соответствие и удаление/Замена строки

Я пытаюсь искать и удалять строки, которые выглядят как:

1 из 2122 НАПЕЧАТАННЫХ 07/01/2013 4:46 Страницы: 1 из 11 2 из 2122 НАПЕЧАТАНА 07/01/2013 04: 46 Страница: 2 из 11 3 из 2122 НАПЕЧАТАННОЙ 07/01/2013 4:46 Страница: 3 из 11

и так далее

затем я хочу, чтобы заменить последнюю строку (которая будет что-то вроде "читать 2122 из 2122 ") с« пользовательским »нижним колонтитулом.

Я использую RegEx, но новичок в использовании, поэтому как должен выглядеть мой RegEx для этого? Я планирую использовать функцию «count count» RegEx, чтобы узнать, когда я нашел последнюю строку, а затем сделаю .replace на ней.

Я использую VB .NET, но могу при необходимости переводить C#. Как я могу выполнить то, что я ищу? В частности, я только заботиться о соответствии/удаление матча так долго, как # спичек> 1.

+1

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

+0

Существует ли нижний колонтитул на собственной линии? Это может помочь с правильным Regex. Что касается удаления каждого совпадения, вы можете сделать 'regex.replace' и заменить свое соответствие пустой строкой ... Опубликовать больше данных, и мы сможем помочь ... –

+0

@JohnBustos Да, они делают. Я показал формат, но количество страниц может измениться, и оно может находиться в разных местах в общем файле. Эти файлы предназначены для печати, а не для хранения в электронном виде. Таким образом, они содержат много символов управления принтером, которые удаляются до форматирования нижнего колонтитула. – mlw4428

ответ

0

Here's one Я создал с RegExr:

/^(\d+\s+of\s+\d+)(?=\s+printed)/gim 

Это соответствует (номер) (пробел) («из») (пробел) (число) в начале строки, и только если за ним следует (пробел) («напечатан»), регистр нечувствителен к регистру. Флаг/m превращает^и $ в границы, ориентированные на строки.

0

Это, как я в конечном итоге делает его ...

Private Function FixFooters(ByVal fileInput As String, Optional ByVal numberToLeaveAlone As Integer = 1) As String 
    Dim matchpattern As String = "^\d+\W+of\W+\d+\W+PRINTED.*$" 
    Dim myRegEx As New Regex(matchpattern, RegexOptions.IgnoreCase Or RegexOptions.Multiline) 
    Dim replacementstring As String = String.Empty 
    Dim matchCounter As Integer = myRegEx.Matches(fileInput).Count 
    If numberToLeaveAlone > matchCounter Then numberToLeaveAlone = matchCounter 
    Return myRegEx.Replace(fileInput, replacementstring, matchCounter - numberToLeaveAlone, 0) 
End Function 

Я использовал myregextester.com, чтобы получить щёток matchpattern. Поскольку я хотел оставить только один нижний колонтитул (для последующего манипулирования им позже), я создал переменную numberToLeaveAlone, чтобы гарантировать, что мы не удалим ВСЕ переменные. Для целей этой программы я сделал значение по умолчанию 1, но это можно было бы изменить на ноль (я делал это только для чтения в вызывающем коде, поскольку я знаю, что ВСЕГДА хочу оставить его ... но я действительно хотел бы использовать его повторно код). Это довольно быстро, я уверен, что там есть лучшие пути, но этот самый смысл для меня.