正则表达式没有处理转义码

时间:2016-05-19 16:31:45

标签: c# regex string parsing encoding

我的问题涉及正则表达式,应该很简单(我希望)。

我想验证这样的字符串(netsh cmd输出):

MyClass(int a, int b) {
    setPrivIntA(a);
    setPrivIntB(b);
}

使用这种模式:

"\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"

所以,我打算检测这种字符串(xxxxx是某些东西(+)):

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

我在C#中编写了这段代码,但是我的表达式仍无效:

xxxxxURLxxxxxhttps://+:443/SomeWebSite/xxxxxYesxxxxxYesxxxxxSDDLxxxx

所以我想我在c#中使用正则表达式的另一个问题... 可能是编码问题?

感谢您的帮助!

弗朗索瓦

4 个答案:

答案 0 :(得分:0)

首先删除字符串中预期的转义码。根据您的使用方案(C# escape codes)

,最好将它们全部删除
output = output.Replace('\n').Replace('\r').Replace('\t') 

现在你有一个单行字符串,你可以进行正则表达式匹配

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

请注意以下事项: 1- ^和$表示匹配字符串的确切开头和结尾。如果你在行中使用目标字符串,则会导致匹配失败。

2-你需要逃避必要的正则表达式字符。 3-匹配"除新行之外的任何字符一次或多次"你用。+

我希望这会有所帮助

答案 1 :(得分: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.+");

答案 2 :(得分:0)

+表示先前声明的模式中的一个或多个,如果我们将(.|\n)模式与{strong>任何匹配在+之前#39; s,您将全部设置,无需删除或说明转义码。

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

编辑:做这样的事情而不是首先清理你的字符串的风险是你可能会得到误报,因为可能有任何字符将匹配分开,所有这个正则表达式都是确保字符串中的某个地方按顺序排列是字符串

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

答案 3 :(得分: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!!!