Регистрация  |  Вход

Вопрос по RegEx

Как-то за все свое время я не сталкивался с 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 делать.  

DevNull
Но оно не отрабатывает (всегда false). Где я допустил ошибку?

На вскидку - убери слеши в начале и в конце.

[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 лучше на СО поискать.

Chiz
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);

Я бы аккуратнее советовал пользоваться методом 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, в данном контексте он не самый подходящий.

ilya leshchuk
Я бы аккуратнее советовал пользоваться методом find, в данном контексте он не самый подходящий.
А что в нем опасного?

[quote="ilya leshchuk"]Я бы аккуратнее советовал пользоваться методом find, в данном контексте он не самый подходящий.[/quote]А что в нем опасного?

Chiz
А что в нем опасного?

Если напрямую прикрутить 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"

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="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]Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?

Chiz
Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?

Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?

[quote="Chiz"]Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?[/quote]
Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то? 

DevNull
Chiz
Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?

Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?

Тебе маска нужна или метод, который проверит строку на то, что она телефон?

[quote="DevNull"][quote="Chiz"]Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?[/quote]
Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?[/quote]
Тебе маска нужна или метод, который проверит строку на то, что она телефон?

Мне нужно что бы если введенная информация не соответствует маске, выдавало ошибку. Тоесть надо сделать аналог VR которую я сделал и написал про нее тут.

Мне нужно что бы если введенная информация не соответствует маске, выдавало ошибку. Тоесть надо сделать аналог VR которую я сделал и написал про нее тут.

DevNull
stateZipMatcher.find()

Ну так если stateZipMatcher.find() вернет false, то нет телефона, если true - есть. Что здесь сверхестественного или сложного?

[quote="DevNull"]stateZipMatcher.find()[/quote]
Ну так если stateZipMatcher.find() вернет false, то нет телефона, если true - есть. Что здесь сверхестественного или сложного?

DevNull
Chiz
Ну так, если найдет, то телефон в поряде. В этом же и задача. Разве не так?

Надо что бы было именно так как указано в маске телефона. Никак по другому. Так как же мне сделать то?

DevNull, глянь мой комментарий раньше:

ilya leshchuk
На вскидку - убери слеши в начале и в конце.

Chiz
Ну так если 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 в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"

ilya leshchuk
На вскидку - убери слеши в начале и в конце.

Попробовал. Теперь теперь всегда true) Не хочет падлюка.

[quote="ilya leshchuk"]На вскидку - убери слеши в начале и в конце.[/quote]
Попробовал. Теперь теперь всегда true) Не хочет падлюка.

DevNull
Попробовал. Теперь теперь всегда 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]

Большое огромное спасибо!

Большое огромное спасибо! 

ilya leshchuk
Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"
В чем проблема, если этой кучей будет только строка телефона? Мой код проверит, есть ли в передаваемой строке телефон. Вот и проверит, является ли эта строка телефоном.

[quote="ilya leshchuk"]Chiz - смотреть предыдущий комментарий, find в данном случае ответит на вопрос "Содержится ли в куче текста телефон?", а не на вопрос "Является ли строка телефоном?"[/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="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
ilya leshchuk
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 эту разницу не увидит.

ilya leshchuk
Chiz
ilya leshchuk
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.

Chiz
Вижу. Если использовать '^\\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 для данного регулярного выражения зависит от настроек, которые применяются по-умолчанию, если хотите, могу даже сказать от какой настройки это зависит.