C # / Regex Pattern работает в онлайн-тестировании, но не во время выполнения - PullRequest
1 голос
/ 30 марта 2019

С помощью следующего шаблона RegEx:

(?<comment>(^#{2} [^\r\n]+[\s]+)*)(?:^\[(?:(?<hive>HK(?:LM|[DP]D|C[CUR]|U(SERS|SER|SR|S)))[:])?(?<name>[a-z0-9$][a-z0-9-_]{2,63})\])(?<items>[\S\s]*?)(?=\n{2,})

Синтаксический анализ следующего текста:

[HKLM:Connection]
   AuthKey = 0x8a79b42z67fct29b42e07b3fd78nc540
   Url = https://dev.somewebsite.com
   ApiPath = /api/

[HKLM:Settings]
   AutoMinimizeConsole = no
   StyleFile = Default
   PhoneNbrs = [+]?[01]{0,3}[-. ]?[(]?[0-9][0-9][0-9][)]?[-. ]?[0-9][0-9][0-9][-. ]?[0-9][0-9][0-9][0-9]
   PostalCodes = [ABCEGHJKLMNPRSTVXYabceghjklmnprstvxy][0-9][ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz][\s.-]?[0-9][ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz][0-9]

[HKLM:Font-Mapping]
   MonoSpaced = Courier New
   User1 = Software Tester 7
   User2 = Repetition Scrolling
   User3 = basis333

[HKLM:UserInterface]

[HKCU:UserInterface]

[HKCU:Credentials]
   Username =
   Password? =

При вводе в онлайн-тесты Regex результаты выдаются, как и ожидалось, но в коде,совпадений не найдено.Используемая здесь переменная «data» заполняется текстом, представленным выше до этого сегмента:

public const string GROUP_PATTERN = @"(?<comment>(^#{2} [^\r\n]+[\s]+)*)(?:^\[(?:(?<hive>HK(?:LM|[DP]D|C[CUR]|U(SERS|SER|SR|S)))[:])?(?<name>[a-z0-9$][a-z0-9-_]{2,63})\])(?<items>[\S\s]*?)(?=\n{2,})";
Regex groupParser = new Regex(GROUP_PATTERN, RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | RegexOptions.Multiline);
MatchCollection matches = groupParser.Matches(data);
foreach (Match m in matches)
    this.Add(IniGroupItem.Parse(m.Value));

В начале ForEach совпадений нет (должно быть шесть!) ..

Поскольку шаблон работает на тестовых сайтах, но не совсем в c #, я не знаю, как выяснить, какие проблемы возникают у компилятора.Есть идеи / предложения?

1 Ответ

2 голосов
/ 30 марта 2019

Окончания строк в большинстве онлайн-тестировщиков регулярных выражений - только LF.Если бы вы протестировали свое регулярное выражение .NET на тестере регулярных выражений RegexStorm .NET, вы бы определили проблему быстрее, так как ее строки заканчиваются CRLF.

Итак, проблема в (?=\n{2,}), так кактребуется повторение строки 2 или более раз.Поскольку в фактических данных есть две или более последовательностей \r\n, вам необходимо заменить эту часть шаблона на (?=(?:\r\n){2,}).

Если вы говорите, что (?=[\r\n]{3,}) работает для вас, это означает, что вы хотите сопоставить местоположение с 3 или более символами LF или CR.

В смешанных случаях, если вы хотите сопоставитьпосле 2 или более последовательностей разрыва строки CLF или LF вы можете использовать (?=(?>\r\n?|\n){2,}).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...