Regex для бесплатных номеров в Java - PullRequest
1 голос
/ 19 апреля 2010

У меня есть это регулярное выражение для проверки на телефон #, который должен быть бесплатным.

public static final Pattern patternTollFree = Pattern.compile("^((877)|(800)|(866)|(888))");

Так что я хочу получить только те #, где пользователь, возможно, оставил 1 в начале строки, но я пробовал несколько вещей, и я не могу получить соответствие Java.

public String changeRingTo( String changedRinger )
{
    if ( null == changedRinger || changedRinger.length() != 10)
        return changedRinger;
    if ( patternTollFree.matcher(changedRinger).region(0, 2).matches() )
        changedRinger = '1' + changedRinger;
    return changedRinger;
}

Я не могу получить этот 2-й тестовый пример ниже, чтобы преуспеть. Что я делаю не так?

assertEquals( "Regex not working", "8189091000", of.changeRingTo("8189091000"));
assertEquals( "Regex not working", "18769091000", of.changeRingTo("8769091000"));

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

Ваш второй контрольный пример не пройден, потому что он начинается с 876, который не является допустимым бесплатным префиксом. Кроме того, как указано в другом ответе, вы должны изменить region(0, 2) на region(0, 3), хотя вся эта строка может быть значительно упрощена.

1 голос
/ 19 апреля 2010

Второй аргумент region является эксклюзивным, не включающим. Прямо сейчас вы разрешаете ему проверять только первые два символа ввода. Вам нужно изменить его на

if ( patternTollFree.matcher(changedRinger).region(0, 3).matches() )

См. http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#region%28int,%20int%29

Обратите внимание, что избыточно использовать ^ в вашем регулярном выражении, а также указывать регион в вашем сопоставителе.

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