我环顾这个网站寻找一个好的PO Box正则表达式并没有找到任何我喜欢或一直工作的东西,所以我试着自己动手......我感觉很好,但是我我相信这里的善良人士可以在其中挖出一些漏洞:)所以......你对此有什么问题以及你能想到的假阳性/假阴性是什么?
我可以看到的一个警告是PO Box模式必须位于字符串的开头,但还有什么问题呢?
public bool AddressContainsPOB(string Addr)
{
string input = Addr.Trim().ToLower();
bool Result = false;
Regex regexObj1 = new Regex(@"^p(ost){0,1}(\.){0,1}(\s){0,2}o(ffice){0,1}(\.){0,1}((\s){1}|b{1}|[1-9]{1})");
Regex regexObj2 = new Regex(@"^pob((\s){1}|[0-9]{1})");
Regex regexObj3 = new Regex(@"^box((\s){1}|[0-9]{1})");
Match match1 = regexObj1.Match(input);
if (match1.Success)
{ Result = true; }
Match match2 = regexObj2.Match(input);
if (match2.Success)
{ Result = true; }
Match match3 = regexObj3.Match(input);
if (match3.Success)
{ Result = true; }
return Result;
}
答案 0 :(得分:1)
您对我们的期望是什么?你甚至没有给我们有效/无效的字符串。你有没有以某种方式测试你的正则表达式?
乍一看,我不知道有关有效输入的内容是:
我可以看到的一个警告是,邮政信箱模式必须位于字符串的开头
您是否只想在字符串的开头匹配它?您需要知道并在模式中定义它。如果您不想,请删除字符串锚^
的开头,并将其替换为word boundary \b
。
{1}
是多余的,您可以将其删除。
对于{0,1}
,有一个简短形式?
,我更喜欢这个,因为它更短。
^box((\s){1}|[0-9]{1})
匹配“box”后跟空格或后跟数字。这真的是你想要匹配的吗?
(\.)
:为什么要对一个点进行分组?