我有一个验证规则,检查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]+")
)
)
)
) 发布于 2020-02-08 05:33:22
我测试了您在沙盒中编写的验证函数。在测试中,只要日程安排电话为空,验证就允许任何值作为非工作时间电话。如果日程安排电话不是空的,当我在其他字段中输入空格时,它会给出一个错误。当我检查你的代码时,我不能立即明白为什么。缩进可以帮助我理解复杂的函数,所以让我们从添加一些缩进开始,这样我们就可以更好地了解函数在做什么。
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 5555、555-555 5555和555-5555555都可以接受),这可能符合您的要求,也可能不符合您的要求。继续下一个标准:
NOT(REGEX(Physical_Service_After_Hours_Phone__c, "^((\\1)?\\d{11})?$"))该数字不是该正则表达式所要求的以1开头的数字,因此这不匹配,并且计算结果为True的NOT(False)。这个regexp也不允许空格,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,因此表示错误条件。虽然我已经在上面解释了哪些regexp需要重写,以及如何在检查第四个条件时,您应该看到另一个问题:如前所述,当调度编号为空时,我看不到失败的方法。这是因为当调度编号为空时,第四个标准的计算结果始终为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]+")
)此函数检查第一个字符;如果是+,则匹配第一个表达式。然后,如果它没有通过国际号码的regexp,它也会匹配第二个表达式并产生一个错误。另一方面,如果第一个字符不是+,它将不匹配第一个表达式,并继续处理其他验证函数。(我还更新了国际号码的regexp,以弥补俄罗斯有一位数国家代码的事实,根据您的原始要求,用户可能会在代码后面加上空格或破折号。)
或者,您可以编写一个regexp来同时包含北美和国际样式的数字,但代价是易读性。
发布于 2020-07-31 00:53:49
解析和验证数字是一项相当复杂的任务。我认为在Apex中使用libphonenumber端口来解析和验证数字将是最合适的。
https://stackoverflow.com/questions/60084817
复制相似问题