我的问题涉及正则表达式,应该很简单(我希望)。
我想验证这样的字符串(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#中使用正则表达式的另一个问题... 可能是编码问题?
感谢您的帮助!
弗朗索瓦
答案 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!!!