Многострочное регулярное выражение заменяет - PullRequest
2 голосов
/ 28 сентября 2011

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

У меня есть текстовый файл:

F00220034277909272011                                  
H001500020003000009272011                              
D001500031034970000400500020000000025000000515000000000
D001500001261770008003200010000000025000000132500000000
H004200020001014209272011                              
D004200005355800007702200005142000013420000000000000000
D004200031137360000779000005000000012000000000000000000
H050100180030263709272011                              
D050100001876700006000300019500000025000000250000001500
D050100001247060000071500030000000025000000280000000000
D050100002075670000430400020000000025000000515000000000
D050100008342500007702600005700000010000000000000000700
D050100009460270000702100015205000025000000000000006205
D050100008135120000702400015000000010000000000000001000
D050100006938430000702200026700000010000000000000001000
D050100006423710008000200025700000000000000000000001000
D050100009488040008000600007175000000000000000000001000
D050100001299190000800100016300000000000000000000003950
D050100001244850000800400005407000000000000000000001607
D050100001216280000840200020000000000000001000000006200
D050100001216840000479000008175000000000000100000001000
D050100001265880000410200014350000000000000100000001000
D050100007402650002000300026700000000000000100000001000
D050100001305150002000200016175000000000001000000000000
D050100005435430000899700022350000000000001000000000000
D050100031113850000500200008200000000250000100000001000

и с многострочным регулярным выражением (со вкусом .NET) я хочу сделать замену, чтобы получить:

H050100180030263709272011                              
D050100001876700006000300019500000025000000250000001500
D050100001247060000071500030000000025000000280000000000
D050100002075670000430400020000000025000000515000000000
D050100008342500007702600005700000010000000000000000700
D050100009460270000702100015205000025000000000000006205
D050100008135120000702400015000000010000000000000001000
D050100006938430000702200026700000010000000000000001000
D050100006423710008000200025700000000000000000000001000
D050100009488040008000600007175000000000000000000001000
D050100001299190000800100016300000000000000000000003950
D050100001244850000800400005407000000000000000000001607
D050100001216280000840200020000000000000001000000006200
D050100001216840000479000008175000000000000100000001000
D050100001265880000410200014350000000000000100000001000
D050100007402650002000300026700000000000000100000001000
D050100001305150002000200016175000000000001000000000000
D050100005435430000899700022350000000000001000000000000
D050100031113850000500200008200000000250000100000001000

так что, по сути, я беру все, что начинается с [HD]0501 и ничего больше.

Я знаю, что это кажется более подходящим для совпадения, чем замены, но я прохожу предварительно встроенный движок, который принимает только строку шаблона Regex и строку замены regex.

Что я могу предоставить для шаблона и строки замены, чтобы получить желаемый результат? Multiline Regex - это жестко запрограммированная конфигурация?

Первоначально я думал, что что-то вроде этого будет работать:

поиск: (?<Match>^[HD]0501\d+$), но это ничего не соответствовало.

поиск: (?!^[HD]0501\d+$), но это совпало с кучей пустых строк, и я не мог понять, что добавить для строки замены.

поиск: (?!(?<Omit>^[HD]0501\d+$)), «Группа« Пропустить »не найдена».

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

1 Ответ

3 голосов
/ 29 сентября 2011

Попробуйте сопоставить следующий шаблон:

(?m)^(?![HD]0501).+(\r?\n)?

и замените его пустой строкой.

Следующая демонстрационная версия:

using System;
using System.Text.RegularExpressions;

namespace Test
{
  class MainClass
  {  
    public static void Main (string[] args)
    {
      string input = @"F00220034277909272011                                  
H001500020003000009272011                              
D001500031034970000400500020000000025000000515000000000
D001500001261770008003200010000000025000000132500000000
H004200020001014209272011                              
D004200005355800007702200005142000013420000000000000000
D004200031137360000779000005000000012000000000000000000
H050100180030263709272011                              
D050100001876700006000300019500000025000000250000001500
D050100001247060000071500030000000025000000280000000000
D050100002075670000430400020000000025000000515000000000
D050100008342500007702600005700000010000000000000000700
D050100009460270000702100015205000025000000000000006205
D050100008135120000702400015000000010000000000000001000
D050100006938430000702200026700000010000000000000001000
D050100006423710008000200025700000000000000000000001000
D050100009488040008000600007175000000000000000000001000
D050100001299190000800100016300000000000000000000003950
D050100001244850000800400005407000000000000000000001607
D050100001216280000840200020000000000000001000000006200
D050100001216840000479000008175000000000000100000001000
D050100001265880000410200014350000000000000100000001000
D050100007402650002000300026700000000000000100000001000
D050100001305150002000200016175000000000001000000000000
D050100005435430000899700022350000000000001000000000000
D050100031113850000500200008200000000250000100000001000";

      string regex = @"(?m)^(?![HD]0501).+(\r?\n)?";

      Console.WriteLine(Regex.Replace(input, regex, ""));
    }
  }
}

печатает:

H050100180030263709272011                              
D050100001876700006000300019500000025000000250000001500
D050100001247060000071500030000000025000000280000000000
D050100002075670000430400020000000025000000515000000000
D050100008342500007702600005700000010000000000000000700
D050100009460270000702100015205000025000000000000006205
D050100008135120000702400015000000010000000000000001000
D050100006938430000702200026700000010000000000000001000
D050100006423710008000200025700000000000000000000001000
D050100009488040008000600007175000000000000000000001000
D050100001299190000800100016300000000000000000000003950
D050100001244850000800400005407000000000000000000001607
D050100001216280000840200020000000000000001000000006200
D050100001216840000479000008175000000000000100000001000
D050100001265880000410200014350000000000000100000001000
D050100007402650002000300026700000000000000100000001000
D050100001305150002000200016175000000000001000000000000
D050100005435430000899700022350000000000001000000000000
D050100031113850000500200008200000000250000100000001000

Краткое объяснение:

  • (?m)
    • включить многострочный режим, чтобы ^ соответствовал началу новой строки;
  • ^
    • соответствуют началу новой строки;
  • (?![HD]0501)
    • смотрите вперед, чтобы увидетьесли есть нет "H0501" или "D0501";
  • .+
    • соответствуют одному или нескольким символам, отличным от символов разрыва строки;
  • (\r?\n)?
    • соответствует необязательному разрыву строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...