Как-то за все свое время я не сталкивался с RegEx в apex, только по в js и то не очень.
И вот пришла задача сделать проверку на маску телефона аля 1 (234) 567-8910.
В JS как я понимаю это выглядело бы так: /^\d{1}\s{1}\({1}\d{3}\){1}\s{1}\d{3}\-\d{4}$/
А как это сделать на apex?
Как я понял примерно так:
String regstr = '/^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$/';
Boolean Test = Pattern.matches(regstr, phone);
Но оно не отрабатывает (всегда false). Где я допустил ошибку?
Как-то за все свое время я не сталкивался с RegEx в apex, только по в js и то не очень. И вот пришла задача сделать проверку на маску телефона аля 1 (234) 567-8910. В JS как я понимаю это выглядело бы так: /^\d{1}\s{1}\({1}\d{3}\){1}\s{1}\d{3}\-\d{4}$/ А как это сделать на apex? Как я понял примерно так: String regstr = '/^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$/'; Boolean Test = Pattern.matches(regstr, phone); Но оно не отрабатывает (всегда false). Где я допустил ошибку?
Решил не геммороиться и сделал VR:
IF(NOT(ISBLANK(MobilePhone)),
NOT REGEX( MobilePhone , "^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$"),false)
Но все же для личного образования, как же сделать в apex?
Решил не геммороиться и сделал VR: IF(NOT(ISBLANK(MobilePhone)), NOT REGEX( MobilePhone , "^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$"),false) Но все же для личного образования, как же сделать в apex?
Плиз хэлп! Оказалось что VR в данном случает не годится. НУжно в apex делать.
Плиз хэлп! Оказалось что VR в данном случает не годится. НУжно в apex делать.
На вскидку - убери слеши в начале и в конце.
[quote="DevNull"] Но оно не отрабатывает (всегда false). Где я допустил ошибку?[/quote] На вскидку - убери слеши в начале и в конце.
Pattern stateZipPattern = Pattern.compile('([a-zA-Z ]{3,})\\s+([0-9]{5,})');
Matcher stateZipMatcher = stateZipPattern.matcher(locationAddress[2].trim());
if (stateZipMatcher.find()) {
String rawState = stateZipMatcher.group(1);
Сам RegEx лучше на СО поискать.
[code]Pattern stateZipPattern = Pattern.compile('([a-zA-Z ]{3,})\\s+([0-9]{5,})'); Matcher stateZipMatcher = stateZipPattern.matcher(locationAddress[2].trim()); if (stateZipMatcher.find()) { String rawState = stateZipMatcher.group(1);[/code] Сам RegEx лучше на СО поискать.
Я бы аккуратнее советовал пользоваться методом find, в данном контексте он не самый подходящий.
[quote="Chiz"][code]Pattern stateZipPattern = Pattern.compile('([a-zA-Z ]{3,})\\s+([0-9]{5,})'); Matcher stateZipMatcher = stateZipPattern.matcher(locationAddress[2].trim()); if (stateZipMatcher.find()) { String rawState = stateZipMatcher.group(1);[/code][/quote] Я бы аккуратнее советовал пользоваться методом find, в данном контексте он не самый подходящий.
[quote="ilya leshchuk"]Я бы аккуратнее советовал пользоваться методом find, в данном контексте он не самый подходящий.[/quote]А что в нем опасного?
Если напрямую прикрутить find в контексте поставленной задачи, особенно с регулярным выражением, составленным так как в вашем примере, успешно провалидируется в том числе и "1 (234) 567-8910 bla bla bla", "bla bla bla 1 (234) 567-8910", и даже "bla bla bla (234) 567-8910 bla bla bla"
[quote="Chiz"]А что в нем опасного?[/quote] Если напрямую прикрутить find в контексте поставленной задачи, особенно с регулярным выражением, составленным так как в вашем примере, успешно провалидируется в том числе и "1 (234) 567-8910 bla bla bla", "bla bla bla 1 (234) 567-8910", и даже "bla bla bla (234) 567-8910 bla bla bla"
[quote="ilya leshchuk"]Если напрямую прикрутить find в контексте поставленной задачи, особенно с регулярным выражением, составленным так как в вашем примере, успешно провалидируется в том числе и "1 (234) 567-8910 bla bla bla", "bla bla bla 1 (234) 567-8910", и даже "bla bla bla (234) 567-8910 bla bla bla"[/quote]Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?
Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?
[quote="Chiz"]Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?[/quote] Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?
Тебе маска нужна или метод, который проверит строку на то, что она телефон?
[quote="DevNull"][quote="Chiz"]Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?[/quote] Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?[/quote] Тебе маска нужна или метод, который проверит строку на то, что она телефон?
Мне нужно что бы если введенная информация не соответствует маске, выдавало ошибку. Тоесть надо сделать аналог VR которую я сделал и написал про нее тут.
Мне нужно что бы если введенная информация не соответствует маске, выдавало ошибку. Тоесть надо сделать аналог VR которую я сделал и написал про нее тут.
stateZipMatcher.find()
Ну так если stateZipMatcher.find() вернет false, то нет телефона, если true - есть. Что здесь сверхестественного или сложного?
[quote="DevNull"]stateZipMatcher.find()[/quote] Ну так если stateZipMatcher.find() вернет false, то нет телефона, если true - есть. Что здесь сверхестественного или сложного?
Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?
Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?
DevNull, глянь мой комментарий раньше:На вскидку - убери слеши в начале и в конце.
Ну так если stateZipMatcher.find() вернет false, то нет телефона, если true - есть. Что здесь сверхестественного или сложного?
Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"
[quote="DevNull"][quote="Chiz"]Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?[/quote] Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?[/quote] DevNull, глянь мой комментарий раньше: [quote="ilya leshchuk"]На вскидку - убери слеши в начале и в конце.[/quote] [quote="Chiz"]Ну так если stateZipMatcher.find() вернет false, то нет телефона, если true - есть. Что здесь сверхестественного или сложного?[/quote] Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"
На вскидку - убери слеши в начале и в конце.
Попробовал. Теперь теперь всегда true) Не хочет падлюка.
[quote="ilya leshchuk"]На вскидку - убери слеши в начале и в конце.[/quote] Попробовал. Теперь теперь всегда true) Не хочет падлюка.
Попробовал. Теперь теперь всегда true) Не хочет падлюка.
DevNull, может ты удалил и бэкслэши (хотя тогда был бы всегда false ), потому что должно получиться вот так:
String regstr = '^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$';
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-8930')); //true
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-893A')); //false
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, 'B')); //false
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-8930111')); //false
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, 'A (234) 567-8930')); //false
[quote="DevNull"]Попробовал. Теперь теперь всегда true) Не хочет падлюка.[/quote] DevNull, может ты удалил и бэкслэши (хотя тогда был бы всегда false :) ), потому что должно получиться вот так: [code] String regstr = '^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$'; System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-8930')); //true System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-893A')); //false System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, 'B')); //false System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-8930111')); //false System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, 'A (234) 567-8930')); //false [/code]
Большое огромное спасибо!
Большое огромное спасибо!
Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"
[quote="ilya leshchuk"]Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"[/quote]В чем проблема, если этой кучей будет только строка телефона? Мой код проверит, есть ли в передаваемой строке телефон. Вот и проверит, является ли эта строка телефоном.
String regstr = '^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$';
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-8930')); //true
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-893A')); //false
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, 'B')); //false
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-8930111')); //false
System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, 'A (234) 567-8930')); //false
[/code]
Хотя, такое решение мне больше нравится :-)
[quote="ilya leshchuk"] String regstr = '^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$'; System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-8930')); //true System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-893A')); //false System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, 'B')); //false System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, '1 (234) 567-8930111')); //false System.debug(System.LoggingLevel.ERROR, Pattern.matches(regstr, 'A (234) 567-8930')); //false [/code][/quote] Хотя, такое решение мне больше нравится :-)
Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"
Chiz, т.е. ты не видишь разницу между "1 (234) 567-8930" и "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 1 (234) 567-8930 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", потому что в том контексте, что я написал, find эту разницу не увидит.
[quote="Chiz"][quote="ilya leshchuk"]Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"[/quote]В чем проблема, если этой кучей будет только строка телефона? Мой код проверит, есть ли в передаваемой строке телефон. Вот и проверит, является ли эта строка телефоном.[/quote] Chiz, т.е. ты не видишь разницу между "1 (234) 567-8930" и "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 1 (234) 567-8930 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", потому что в том контексте, что я написал, find эту разницу не увидит.
Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"
Chiz, т.е. ты не видишь разницу между "1 (234) 567-8930" и "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 1 (234) 567-8930 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", потому что в том контексте, что я написал, find эту разницу не увидит.
Вижу. Если использовать '^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$' в моем коде, то вторая строка вернет false.
[quote="ilya leshchuk"][quote="Chiz"][quote="ilya leshchuk"]Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"[/quote]В чем проблема, если этой кучей будет только строка телефона? Мой код проверит, есть ли в передаваемой строке телефон. Вот и проверит, является ли эта строка телефоном.[/quote] Chiz, т.е. ты не видишь разницу между "1 (234) 567-8930" и "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 1 (234) 567-8930 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", потому что в том контексте, что я написал, find эту разницу не увидит.[/quote] Вижу. Если использовать '^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$' в моем коде, то вторая строка вернет false.
Вижу. Если использовать '^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$' в моем коде, то вторая строка вернет false.
Поэтому я написал с поправками - использование границ практически приравнивает его к match в данном случае, хотя, если быть предельно точным, то результат метода find для данного регулярного выражения зависит от настроек, которые применяются по-умолчанию, если хотите, могу даже сказать от какой настройки это зависит.
[quote="Chiz"]Вижу. Если использовать '^\\d{1}\\s{1}\\({1}\\d{3}\\){1}\\s{1}\\d{3}\\-\\d{4}$' в моем коде, то вторая строка вернет false.[/quote] Поэтому я написал с поправками :) - использование границ практически приравнивает его к match в данном случае, хотя, если быть предельно точным, то результат метода find для данного регулярного выражения зависит от настроек, которые применяются по-умолчанию, если хотите, могу даже сказать от какой настройки это зависит.