Правило проверки Salesforce для регулярных номеров США и международных номеров, не принимающих пробелы - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть правило проверки для проверки 10 ди git телефонных номеров США, 11 ди git американских и канадских телефонных номеров и международных телефонных номеров, начинающихся с +, где код страны не начинается с 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]+")
)
)
)
)  

1 Ответ

0 голосов
/ 08 февраля 2020

Я проверил вашу функцию проверки как написано в Песочнице. При тестировании проверка допускает любое значение в качестве телефона в нерабочее время, если телефон планирования пуст. Если расписание не пустое, выдается ошибка, когда я помещаю пробелы в другое поле. Я не мог сразу понять, почему при просмотре вашего кода. Отступ помогает мне понять сложные функции, поэтому давайте начнем с добавления отступов, чтобы лучше видеть, что делает функция.

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, как того требует данное регулярное выражение, поэтому оно не соответствует и оценивается как NOT(False), что составляет True. Это регулярное выражение также не допускает пробелов и требует 11 цифр после 1, что, скорее всего, не то, что вы хотели. Нет необходимости убегать 1 с косой чертой. Вы можете объединить это с вышеупомянутым в одно регулярное выражение, добавив к нему префикс (1[ -]?)?, сделав необязательным начало с 1, но оставив пробел или da sh, если вы это сделаете.

Это подводит нас к Четвертый критерий, который немного сложнее:

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]+")
)

Эта функция проверяет первый символ; если это +, это соответствует первому выражению. Затем, если ему не удается выполнить регулярное выражение для международных чисел, оно также соответствует второму выражению и выдает ошибку. С другой стороны, если первый символ не является +, он не будет соответствовать первому выражению и продолжит обрабатывать другие функции проверки. (Я также обновил ваше регулярное выражение для международных номеров, чтобы компенсировать тот факт, что в России существует один код страны с ди git, оставляя открытой возможность того, что пользователь может следовать за ним с пробелом или да sh в соответствии с вашими первоначальными требованиями. )

В качестве альтернативы, вы можете написать регулярное выражение, чтобы охватить номера как в Северной Америке, так и в международных стилях, но за счет разборчивости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...