Результаты регулярных выражений отличаются между C # и regex101 - PullRequest
0 голосов
/ 09 июня 2018

Я создал следующее регулярное выражение

^xy_yx_blaa_(\d+)([\s\S]*?)(^[A-D]$|QM)+[\s\S]*?(?:SW|Analyzing)

И проблема у меня заключается в том, что при запуске это regex101 для примера, он получит 199 совпадений (это то, что я хочу), но когда я используюв моей программе на C # получено только 55 совпадений

После дальнейшего изучения я обнаружил, что программа на C # соответствует только тексту, содержащему только "QM", но в regex101 она соответствует тексту, содержащему A | B | C |D | QM

Это мой текущий код

TextExtractor extractor = new TextExtractor(path);
string text = extractor.ExtractText();
MatchCollection matches = Regex.Matches(text, pattern, RegexOptions.Multiline);

Заранее спасибо

вот пример входной строки

xy_yx_blaa_184

is the act of composing and sending electronic messages, typically
consisting of alphabetic and numeric characters, between two or more
users of mobile phones, tablets, desktops/laptops, or other devices.
Text messages may be sent over a cellular network, or may also be sent
via an Internet connection.

Derived

QM

SW

xy_yx_blaa_199

is the act of composing and sending electronic messages, typically
consisting of alphabetic and numeric characters, between two or more
users of mobile phones, tablets, desktops/laptops, or other devices.
Text messages may be sent over a cellular network, or may also be sent
via an Internet connection.

Derived

A

SW

inВ приведенном выше примере текста C # будет захватывать первый (он содержит QM), но в регулярном выражении 101 он захватит оба

1 Ответ

0 голосов
/ 09 июня 2018

Вы должны добавить необязательный шаблон \r? перед любым $ при использовании RegexOptions.Multiline (или его эквивалента (?m)) из-за того, что файлы могут иметь окончания Windows CRLF, а привязка $ совпадает только перед\n, символ НЧ.

Кроме того, [\s\S] - это скорее взлом, вам нужно использовать . и RegexOptions.Singleline для сопоставления с любым символом.

var pattern = @"^xy_yx_blaa_(\d+)(.*?)(^[A-D]\r?$|QM)+.*?(?:SW|Analyzing)";
var results = Regex.Matches(text, pattern, RegexOptions.Multiline | RegexOptions.Singleline)
    .Cast<Match>()
    .Select(m => m.Value)
    .ToList();

Вот демо regex и демо C # .

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