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

Convert user-defined pseudo regex string into working regex

要匹配的字符串 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);

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

与您的输入字符串匹配的正则表达式模式是 .*?\://.*?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.*?

问题:

在所有这些替换调用之后,您的模式字符串变为 ".*?\://.*?mysite\\.com.*?"

基本上,在 mysite 之后,这样的模式必须匹配一个 '\' 字符和一些任意符号。

怎么会这样?让我们看一下您的替换循环和要替换的字符串列表:

List<string> lstRegexSpecialCharList = new List<string> 
{ 
  "^", "$", ".", "?", "+", "(", ")", "[", "{", "]", "}", 
  "\", // The culprit
  "=", "<", ">", ":", "-" 
};

foreach (var item in lstRegexSpecialCharList)
{
      srRegexPattern = srRegexPattern.Replace(item, "\" + item);
}

是的,罪魁祸首是斜线字符串——毕竟那些 "\" + item srRegexPattern 将有一个斜线字符,当 [=18= 时迭代将变成 "\\" ] 变成 "\".

解法:

只需替换开头的所有斜杠:

List<string> lstRegexSpecialCharList = new List<string> 
{ 
     @"\",  //All original slashes will be escaped and none of the "regex" slashes will suffer
     "^", "$", ".", "?", "+", "(", ")", "[", "{", "]", "}", "=", "<", ">", ":", "-" 
};

P.S.: 无论如何这样的解决方案看起来有点不可靠(可能有一些不考虑替换的情况)并且可能有一些性能问题由于多个 Replace 调用(可以通过字典查找替换字符串和更简化的模式构建(例如使用 StringBuilder)来解决)。