Регулярные выражения (регулярные выражения) приводят к сбою программы

#c# #regex

#c# #регулярное выражение

Вопрос:

Я использую программу, которая берет файл .csv и преобразует его в файл .SGM (sgml), который соответствует определенной схеме / dtd, которую мы используем.

К сожалению, инструмент, который выполняет преобразование, помещает несколько элементов в неправильном порядке при преобразовании в SGML, поэтому я написал несколько регулярных выражений, чтобы исправить это. Я использовал программу под названием «Расширенный поиск и замена» для написания и тестирования регулярных выражений (отличная программа, которую я использую годами), и впоследствии я написал приложение для Windows на C #, которое делает то же самое.

Все работает абсолютно идеально, для эквивалента 43 строк файла csv. Больше, чем это, и любая из программ выйдет из строя (расширенная замена поиска и мое собственное приложение для Windows). Файл .SGM, в котором я запускаю регулярное выражение, составляет около 12 КБ — такой крошечный.

Это явно не само регулярное выражение, поскольку оно работает с меньшим количеством строк данных. Кажется, когда я добавляю 43-ю строку в файл CSV и конвертирую ее в SGML, а затем запускаю регулярное выражение, начинаются мои проблемы. И нет, это не имеет ничего общего с самой строкой данных.

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

Любые указания или идеи, что происходит, пожалуйста?

 SearchFor=<iplnom>(.*?)<nom>(.*?)</nom>
ReplaceWith=<iplnom><nom>$2</nom>$1

SearchFor=<iplnom><nom>(.*?)</nom>(.*?)<mfr>(.*?)</mfr>
ReplaceWith=<iplnom><nom>$1</nom><mfr>$3</mfr>$2

SearchFor=<iplnom><nom>(.*?)</mfr>(.*?)<mdl>(.*?)</mdl>
ReplaceWith=<iplnom><nom>$1</mfr><mdl>($3)</mdl>$2

SearchFor=<iplnom><nom>(.*?)</mdl>(.*?)<fds>(.*?)</fds>
ReplaceWith=<iplnom><nom>$1</mdl><fds>$3</fds>$2

SearchFor=<iplnom><nom>(.*?)</fds>(.*?)<alprtmfr>(.*?)</alprtmfr>
ReplaceWith=<iplnom><nom>$1</fds><alprtmfr>$3</alprtmfr>$2

SearchFor=<iplnom><nom>(.*?)</alprtmfr>(.*?)<msc>(.*?)</msc>
ReplaceWith=<iplnom><nom>$1</alprtmfr><msc>$3</msc>$2

SearchFor=<iplnom><nom>(.*?)</msc>(.*?)<uoi>(.*?)</uoi>
ReplaceWith=<iplnom><nom>$1</msc><uoi>$3</uoi>$2

SearchFor=<iplnom><nom>(.*?)</uoi>(.*?)<esds>(.*?)</esds>
ReplaceWith=<iplnom><nom>$1</uoi><esds>$3</esds>$2

SearchFor=<msc></msc>
ReplaceWith=

SearchFor=<esds></esds>
ReplaceWith=

SearchFor=<osc></osc>
ReplaceWith=

SearchFor=<uoi></uoi>
ReplaceWith=

SearchFor=<mdl>()</mdl>
ReplaceWith=

SearchFor=<alprtmfr><altpn></altpn><mfr></mfr></alprtmfr>
ReplaceWith=

SearchFor=<alprtmfr><altpn></altpn></alprtmfr>
ReplaceWith=

SearchFor=<mfr></mfr>
ReplaceWith=

SearchFor=<fds></fds>
ReplaceWith=
  

Комментарии:

1. Где код C #? Я не вижу, как мы можем ответить на это.

2. Похоже, вы имеете дело с XML. Я предлагаю вам использовать анализатор XML вместо регулярных выражений.

3. @juharr SGML выглядит только как XML. Он должен использовать анализатор SGML.

4. В этом случае C # не имеет значения, поскольку он также приводит к сбою «Расширенного поиска и замены», когда я запускаю регулярное выражение с этим. Программа C # также отлично работает с меньшим количеством строк данных. Другими словами, проблема не в коде, а в регулярном выражении.

5. Спасибо @MartinBrown, готовый инструмент изначально преобразует файл .csv в SGML. Он создает элементы и т. Д., Но некоторые из них строятся в неправильном порядке. Мое регулярное выражение выполняется в файле SGML, чтобы исправить элементы, используя обратные ссылки, как вы можете видеть. Я знаю, что, вероятно, есть лучшие способы (синтаксические анализаторы и т. Д.), Но я искал «быстрый и грязный способ» исправить это. И это работает, но только для ограниченного объема данных. Программа на C #, похоже, переходит в бесконечный цикл. Ошибок нет. Проблема может быть в катастрофическом возврате, мне придется разобраться в этом, поскольку я не слишком хорошо знаком.