将用户定义的伪正则表达式字符串转换为工作正则表达式

时间:2015-03-21 16:58:37

标签: c# .net regex .net-4.5

匹配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);

但是,似乎我没有正确使用它,因为生成的正则表达式无法匹配我的输入字符串。

2 个答案:

答案 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))。