匹配www.ads://fkdsmkdsf.mysite.comkmdfgkkdf
伪正则表达式模式:*://*mysite.com*
所需的正则表达式模式.*?\://.*?mysite\\.com.*?
我的代码:
string srinput = "www.ads://fkdsmkdsf.mysite.comkmdfgkkdf";
string srRegexPattern = "*://*mysite.com*";
List<string> lstRegexSpecialCharList = new List<string> {
"^", "$", ".", "?", "+", "(", ")", "[", "{", "]", "}",
"\\","=","<",">",":","-" };
foreach (var item in lstRegexSpecialCharList)
{
srRegexPattern = srRegexPattern.Replace(item, "\\" + item);
}
srRegexPattern = srRegexPattern.Replace("*", ".*?");
bool blResult = Regex.IsMatch(srinput, srRegexPattern);
但是,似乎我没有正确使用它,因为生成的正则表达式无法匹配我的输入字符串。
答案 0 :(得分:2)
与输入字符串匹配的正则表达式模式为.*?\://.*?mysite\.com.*?
。双反斜杠\\
将匹配文字\
。
您不需要任何特殊字符列表,Regex.Escape()
为您完成所有操作。
string srinput = "www.ads://fkdsmkdsf.mysite.comkmdfgkkdf";
string srRegexPattern = "*://*mysite.com*";
srRegexPattern = Regex.Escape(srRegexPattern).Replace("\\*", ".*?");
bool blResult = Regex.IsMatch(srinput, srRegexPattern);
输出正则表达式符合预期:.*?://.*?mysite\.com.*?
。
答案 1 :(得分:1)
问题:
在所有替换调用之后,您的模式字符串变为".*?\\://.*?mysite\\\\.com.*?"
基本上,mysite
此类模式必须匹配一个'\'
字符和一些任意符号。
这怎么可能发生?让我们来看看你的替换循环和带有要替换的字符串的列表:
List<string> lstRegexSpecialCharList = new List<string>
{
"^", "$", ".", "?", "+", "(", ")", "[", "{", "]", "}",
"\\", // The culprit
"=", "<", ">", ":", "-"
};
foreach (var item in lstRegexSpecialCharList)
{
srRegexPattern = srRegexPattern.Replace(item, "\\" + item);
}
是的,罪魁祸首是斜线字符串 - 毕竟那些"\\" + item
srRegexPattern
将有一个斜杠字符,当"\\\\"
变为item
时,它会在迭代时变成"\\"
List<string> lstRegexSpecialCharList = new List<string>
{
@"\", //All original slashes will be escaped and none of the "regex" slashes will suffer
"^", "$", ".", "?", "+", "(", ")", "[", "{", "]", "}", "=", "<", ">", ":", "-"
};
。
<强>解决方案:强>
只需在开头替换所有斜杠:
Replace
PS:在任何情况下,此类解决方案看起来有点不可靠(可能会有一些未考虑的替换案例),并且由于多次{{1}}调用可能会出现一些性能问题(可能是解决了字典查找替换字符串和更简化的模式构建(例如使用StringBuilder))。