Как выбрать все, включая регистр (регулярное выражение) в c#? - PullRequest
2 голосов
/ 05 марта 2020

У меня проблема с командой regex,

У меня есть файл с тоннами строк и множеством чувствительных символов,

this is an Example with all sensitive case 0123456789/*-+.&é"'(-è_çà)=~#{[|`\^@]}²$*ù^%µ£¨¤,;:!?./§<>AZERTYUIOPMLKJHGFDSQWXCVBNazertyuiopmlkjhgfdsqwxcvbn

Я пробовал много команд regex, но никогда не получал ожидаемого результата, я должен выбрать все от Пример до конца


Я пробовал эту команду на https://www.regextester.com/:

\ sExample (. *?) +

Изображение результата здесь

И когда я попробовал его в C# единственный результат, который я получил: Example

Я не понимаю, почему - '

1 Ответ

2 голосов
/ 05 марта 2020

Вот краткий чат о жадности и пессимистичности c:

Вот тестовые данные:

Example word followed by another word and then more

Вот два регулярных выражения:

Example.*word
Example.*?word

Первый жадный. Регулярное выражение будет соответствовать Example, затем потребуется .*, которое потребляет все до конца строки, и работы возвращаются назад, выпуская символ за раз, пытаясь добиться успеха. Это будет успешным, когда Example word followed by another word соответствует, * соответствует word followed by another (и пробелам на обоих концах)

Второе пессимистично; он грыз вперед вдоль строки по одному символу за раз, пытаясь сопоставить. Регулярное выражение будет соответствовать Example, затем в подстановочный знак .*? добавится еще один символ, затем проверит, нашло ли оно word, что и было. Так что pessimisti c match найдет только один пробел, а полное совпадение в режиме pessimisti c равно Example word

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

Это затем сопоставит (и перехватит) все после примера:

\sExample(.*)

Скобки составляют группу захвата. В c# мы можем назвать группу, используя ?<namehere> в начале скобок, а затем все, что совпадает с *, можно получить с помощью:

Regex r = new Regex("\sExample(?<x>.*)");
Match m = r.Match("Exampleblahblah");
Console.WriteLine(m.Groups["x"].Value); //prints: blahblah 

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

enter image description here

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