美国和国际电话号码正则表达式的 Salesforce 验证规则不接受空格



我有一个验证规则,检查 10 位美国电话号码、11 位美国和加拿大电话号码以及以 + 开头的国际电话号码,其中国家/地区代码不以 1 开头,他们希望允许使用破折号和空格。 除了允许空格外,我的验证规则似乎有效。

AND(
NOT(ISBLANK( Physical_Service_After_Hours_Phone__c)),
NOT(REGEX( Physical_Service_After_Hours_Phone__c, "(\d){10}")),  
NOT(REGEX(Physical_Service_After_Hours_Phone__c,"^((\1)?\d{11})?$")),
NOT(
AND(
OR(
LEN(Physical_Service_Scheduling_Phone__c )=0,
REGEX(Physical_Service_After_Hours_Phone__c, "^(\+)([2-9])[0-9\-\s]+")
)
)
)
)  

我测试了您在沙盒中编写的验证函数。在测试中,只要计划电话为空,验证就允许任何值作为下班后电话。如果调度电话不为空,则当我在其他字段中放置空格时会出错。在查看您的代码时,我无法立即明白为什么。缩进有助于我理解复杂的函数,所以让我们从添加一些缩进开始,以便我们可以更好地了解函数在做什么。

AND(
NOT(ISBLANK(Physical_Service_After_Hours_Phone__c)),
NOT(REGEX(Physical_Service_After_Hours_Phone__c, "(\d){10}")),  
NOT(REGEX(Physical_Service_After_Hours_Phone__c, "^((\1)?\d{11})?$")),
NOT(
AND(
OR(
LEN(Physical_Service_Scheduling_Phone__c)=0,
REGEX(Physical_Service_After_Hours_Phone__c, "^(\+)([2-9])[0-9\-\s]+")
)
)
)
)

现在我们看到有四个主要标准,第四个标准比其他标准更复杂。让我们看看一个样本的下班后555 555 1212数如何通过这个函数,假设调度号不为空。

NOT(ISBLANK(Physical_Service_After_Hours_Phone__c))

下班后的数字不为空,因此计算结果为NOT(False)True

NOT(REGEX(Physical_Service_After_Hours_Phone__c, "(\d){10}"))

如果我们省略空格,这将匹配正则表达式;但正则表达式不允许空格,因此这评估为NOT(False)True。如果要允许空格,请告诉模式匹配器它们可以在哪里。如果该规则旨在仅涵盖北美数字,我们将数字分组为 3-3-4。这将起作用:"\d{3}[ -]?\d{3}[ -]?\d{4}".请注意,这排除了添加分机号码,并且还允许随意间隔(555555 5555555-555 5555555-5555555都是可以接受的(,这可能满足您的要求,也可能不符合您的要求。继续下一个标准:

NOT(REGEX(Physical_Service_After_Hours_Phone__c, "^((\1)?\d{11})?$"))

该数字不按此正则表达式的要求以 1 开头,因此这不匹配并计算为NOT(False)哪个是True。此正则表达式也不允许空格,并且需要在1后添加 11 位数字,这不太可能是您想要的。没有必要用斜杠逃脱1。您可以通过在前面加上(1[ -]?)?将其与上述内容组合成一个正则表达式,使其可以选择以 1 开头,但如果这样做,则允许使用空格或破折号。

这就引出了第四个标准,它有点复杂:

NOT(
AND(
OR(
LEN(Physical_Service_Scheduling_Phone__c )=0,
REGEX(Physical_Service_After_Hours_Phone__c, "^(\+)([2-9])[0-9\-\s]+")
)
)
)

如果我们假设调度电话的长度不是 0(即,我们在那里放了一些东西(,第一个表达式的计算结果为False。而且由于下班后的数字不以加号开头,因此它与正则表达式不匹配,正则表达式的计算结果也为False.然后我们最终得到NOT(AND(OR(False, False))),这是True。顺便说一下,您可以删除AND()函数,因为它不会做任何有用的事情。

解决了所有四个准则后,我们现在有了AND(True, True, True, True),这是True,因此表示一个错误条件。虽然我已经在上面解释了哪些正则表达式需要重写以及如何在检查第四个标准时,您应该看到另一个问题:如前所述,当调度编号为空时,我看不到失败的方法。这是因为当调度编号为空时,第四个条件的计算结果始终为False,因此无论其他字段中的内容如何,都不会出错。

我建议做我上面所做的:将你的问题分解成更小的部分,一次解决一个。您可以使用多个验证规则来检查这一点。例如:

AND(
LEFT(Physical_Service_After_Hours_Phone__c, 1) = "+",
NOT(REGEXP(Physical_Service_After_Hours_Phone__c, "^\+([2-9]|8[\-\s])[0-9\-\s]+")
)

此函数检查第一个字符;如果它是 +,则与第一个表达式匹配。然后,如果它未能通过国际号码的正则表达式,它也与第二个表达式匹配并产生错误。另一方面,如果第一个字符不是 +,它将与第一个表达式不匹配并继续处理其他验证函数。(我还更新了国际号码的正则表达式,以弥补俄罗斯有一位数国家代码的事实,从而保留了用户可能会根据您的原始要求在后面加上空格或破折号的可能性。

或者,您可以编写一个正则表达式来包含北美和国际样式的数字,但要以易读性为代价。

最新更新