oI有以下代码尝试验证URL是否具有某种格式: 我已经提出了这个正则表达式,但由于我缺乏经验,我似乎无法弄清楚它到底出了什么问题。
正则表达式的所有网址都是http / https,www / Bil / Qc,product.company,qc1 / qc2 / com。
任何人都认为这有任何问题,它应该正确匹配:
string origin = "https://bil-product.company.com/";
Regex reg = new Regex("(http[s]?://)+(BIL|QC)*product.company.(qc1|qc2|com)", RegexOptions.Singleline & RegexOptions.IgnoreCase);
if (reg.IsMatch(origin))
{
//Do thangs with codes and stuff
}
答案 0 :(得分:3)
此正则表达式匹配:
(http[s]?://)+(BIL|QC).*product\.company\.(qc1|qc2|com)
您在-
之前忘记了product
。我用*
替换了-
(不知道你为什么在那里使用它)。但还有一些其他问题:
它不会起作用,因为选项必须是" OR
ed"而不是" AND
ed" (AND
重置标志):
Regex reg = new Regex(..., RegexOptions.Singleline | RegexOptions.IgnoreCase);
为什么(http[s]?://)+
允许此模式发生一次或更多次,因此您的模式匹配https://https://bil-product.company.com/
答案 1 :(得分:3)
不应该使用OR运算符|在最后组合正则表达式标志?也许RegexOptions.Singleline | RegexOptions.IgnoreCase
可以做到这一点。由于AND运算符,您的代码可能不会使用RegexOptions.IgnoreCase
。
除了其他问题,以下代码也可以使用:
string origin = "https://bil-product.company.com/";
Regex reg = new Regex("(http[s]?://)((BIL|QC)-)?product\\.company\\.(qc1|qc2|com)", RegexOptions.Singleline | RegexOptions.IgnoreCase);
if (reg.IsMatch(origin))
{
//Do things with codes and stuff
}
答案 2 :(得分:1)
您不需要RegexOptions.Singleline
。看起来您忘记了正则表达式中的“www”和结尾“/”部分。如果您想确保只与所需的字符串完全匹配,可以使用^
和$
分别匹配字符串的开头和结尾,所以......
string[] origins = { "http://qc-product.company.com/",
"https://www.company.com/",
"https://bil-product.company.com/",
"http://company.com/",
"http://www.example.com/",
"http://www.company.com/example.html" };
Regex reg = new Regex(@"^(http[s]?://)(www|((BIL|QC)-product))\.company\.(qc1|qc2|com)/$", RegexOptions.IgnoreCase);
foreach (string origin in origins)
{
Console.Write(origin + " ");
Console.WriteLine(reg.IsMatch(origin) ? "match" : "not");
}
Console.ReadLine();
输出:
http://qc-product.company.com/ match
https://www.company.com/ match
https://bil-product.company.com/ match
http://company.com/ not
http://www.example.com/ not
http://www.company.com/example.html not