2016-05-19 2 views
0

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

Я хочу, чтобы проверить строку, как это (Netsh выхода CMD):

"\r\nR‚servations d'URLÿ:\r\n--------------------\r\n\r\n URL r‚serv‚e   : https://+:443/SomeWebSite/ \r\n  Utilisateurÿ: AUTORITE NT\\SERVICE R\u0090SEAU\r\n   \u0090couterÿ: Yes\r\n   D‚l‚guerÿ: Yes\r\n   SDDLÿ: D:(A;;GA;;;NS) \r\n\r\n\r\n" 

с этим рисунком:

"URL .+https:\/\/\+:443\/SomeWebSite\/.+Yes.+Yes.+SDDL.+" 

Итак, я намерен обнаружить такого рода строки (хххое это что-то (+)):

xxxxxURLxxxxxhttps://+:443/SomeWebSite/xxxxxYesxxxxxYesxxxxxSDDLxxxx 

Я написал этот код в C#, чтобы сделать это, но мое выражение до сих пор не работает:

string output = "\r\nR‚servations d'URLÿ:\r\n--------------------\r\n\r\n URL r‚serv‚e   : https://+:443/SomeWebSite/ \r\n  Utilisateurÿ: AUTORITE NT\\SERVICE R\u0090SEAU\r\n   \u0090couterÿ: Yes\r\n   D‚l‚guerÿ: Yes\r\n   SDDLÿ: D:(A;;GA;;;NS) \r\n\r\n\r\n"; 
output = output.Replace(Environment.NewLine, ""); //==> output2=="R‚servations d'URLÿ:----------- 
Regex testUrlOpened = new Regex(output, RegexOptions.Singleline); 
MessageBox.Show(testUrlOpened.IsMatch(@"URL").ToString()); // ==> False 
MessageBox.Show(testUrlOpened.IsMatch(@".+URL.+").ToString()); // ==> False 
MessageBox.Show(testUrlOpened.IsMatch(@"URL .+https:\/\/\+:443\/SomeWebSite\/.+Yes.+Yes.+SDDL.+").ToString()); // ==> False 

Так что я полагаю, что я еще один вопрос с регулярным выражением в C# ... Может кодировать вопрос?

Спасибо за помощь!

Франсуа

ответ

0

Start, удалив экранирующие коды ожидаемых в строке. Было бы лучше, чтобы удалить их все в зависимости от вашего использования сценария (C# escape codes)

output = output.Replace('\n').Replace('\r').Replace('\t') 

Теперь у вас есть одна строка строки, вы можете сделать регулярное выражение соответствия

.+URL.+https:\/\/.+:443\/SomeWebSite\/.+Yes.+Yes.+SDDL.+ 

Обратите внимание на следующее: 1-^и $ означает совпадение с точным началом и концом строки. Если у вас есть целевая строка в строке с использованием этих параметров, это приведет к сбою соответствия.

2- Вам необходимо избежать необходимости в регулярных выражениях. 3- Чтобы соответствовать «Любой символ, кроме новой строки один или несколько раз» вы используете +

Я надеюсь, что это помогает

+0

Привет Моатаз, спасибо за вашу помощь ... Два много лет с момента моего последнего регулярного выражения ... :) – Francois

+0

Добро пожаловать. Вы можете использовать: http://regexr.com/. Я считаю, что это очень полезно при отладке и понимании выражений регулярных выражений. – mymo

+0

Не полагайтесь на regexr для тестирования регулярных выражений .NET, он не поддерживает синтаксис .NET regex. Проверьте '[\ w - [_]] +' в regexr и [regexstorm] (http://regexstorm.net/tester) с 'new_word' –

0

Вы можете использовать Regex.Unescape для экранирования в строку, а затем сделать свой матч регулярного выражения:.

var output = @"\r\nR‚servations d'URLÿ:\r\n--------------------\r\n\r\n URL r‚serv‚e   : https://+:443/SomeWebSite/ \r\n  Utilisateurÿ: AUTORITE NT\\SERVICE R\u0090SEAU\r\n   \u0090couterÿ: Yes\r\n   D‚l‚guerÿ: Yes\r\n   SDDLÿ: D:(A;;GA;;;NS) \r\n\r\n\r\n"; 
output = Regex.Unescape(output).Dump(); 

var foundUrl = Regex.IsMatch(output, @"URL .+ https://\+:443/SomeWebSite/.+YES.+YES.+SDDL.+"); 
0

+ указывает на 1 или более ранее заявленной модели, если мы ставим шаблон (.|\n), который соответствует ничего, перед тем +-х, вы будете все, без рем ove или учет эвакуационных кодов.

^(.|\n)+URL(.|\n)+https://(.|\n)+:443/SomeWebSite/(.|\n)+Yes(.|\n)+Yes(.|\n)+SDDL(.|\n)+$

EDIT: риск сделать что-то вроде этого вместо дезинфицирующего вашей строки первым в том, что вы можете получить ложные срабатывания, потому что может быть любым символ, разделяющие спички, все это регулярное выражение делает это гарантировать, что где-то в строка, в порядке, это строки

"URL", "https://", ":443/SomeWebSite/", "Yes", "Yes", "SDDL" 
+0

Спасибо, проще, по-моему, удалить «\ r \ n» в строке ввода, но интересная идея. – Francois

0

Так просто. Последняя проблема была вызвана выражением reg, чтобы добавить конструктор Regex и строку ввода в методе IsMatch ...:( Так окончательный код:

string output = "\r\nR‚servations d'URLÿ:\r\n--------------------\r\n\r\n URL r‚serv‚e   : https://+:443/SomeWebSite/ \r\n  Utilisateurÿ: AUTORITE NT\\SERVICE R\u0090SEAU\r\n   \u0090couterÿ: Yes\r\n   D‚l‚guerÿ: Yes\r\n   SDDLÿ: D:(A;;GA;;;NS) \r\n\r\n\r\n"; 
output = output.Replace(Environment.NewLine, ""); //==> output2=="R‚servations d'URLÿ:----------- 
Regex testUrlOpened = new Regex((@"URL .+https:\/\/\+:443\/SomeWebSite\/.+Yes.+Yes.+SDDL.+", RegexOptions.Singleline); 
MessageBox.Show(testUrlOpened.IsMatch(output).ToString()); // ==> True!!!