将用户定义的伪正则表达式字符串转换为工作正则表达式
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)来解决)。
要匹配的字符串 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)来解决)。