2014-02-09 4 views
0

Можете ли вы помочь мне разметить пользовательского ввода для номера телефона в следующем формате: ххх ххх-хххх в первой еще, еслиСтрока токенизатор лексем номер телефона

Регулярное выражение было подтверждено, чтобы работать правильно. Я включу его.

Чтобы выполнить ту же процедуру, у меня есть с остальными номерами телефонов, я хочу захватить первые 3 цифры в отдельную переменную, а остальные - для конкатенации.

Вот код

else if (ValidatePhone.validateSpaceAfterAreaCode(input)) { 
     StringTokenizer st = new StringTokenizer(input); 
     String token = st.nextToken("\\s").toString(); 
     // firstdigits = new Long(st.nextToken("\\s")).toString(); 
     phoneNumber = new Long(st.nextToken("-")).toString(); 
     phoneNumber += new Long(st.nextToken("-")).toString(); 
     num = Long.parseLong(phoneNumber); 
     JOptionPane.showMessageDialog(null, "first digits: " + token + "\nlast digits: " + num); 
    } 
      //WORKING for xxx.xxx.xxxx 

    else if (ValidatePhone.validateAllPeriods(input)) { 
     StringTokenizer st = new StringTokenizer(input); 
     firstdigits = new Long(st.nextToken(".")).toString(); 
     phoneNumber = new Long(st.nextToken(".")).toString(); 
     phoneNumber += new Long(st.nextToken(".")).toString(); 
     num = Long.parseLong(phoneNumber); 
     JOptionPane.showMessageDialog(null, "first digits: " + firstdigits + "\nlast digits: " + num); 
    } 

здесь функция в классе Validate телефона

public static boolean validateSpaceAfterAreaCode(String acspace) 
{ 
    return acspace.matches("^[1-9]\\d{2}\\s\\d{3}-\\d{4}"); 
} 
+1

есть ли что-нибудь, что мы можем сделать, чтобы помочь вам? – Leo

+0

Я отредактировал вопрос. – Steller

+1

Вам нужно объяснить, с чем вы столкнулись. Что не работает? –

ответ

0

Я бы просто разделить его:

String parts = input.split("\\D+"); 

Это расщепляется с помощью любой последовательности без цифр и создаст массив размером 3, который затем можно разобрать на int и т. д.

1

Вы делаете это намного сложнее, чем должно быть. Я предполагаю, что допустимые формы

nnn nnn-nnnn 
nnn-nnn-nnnn 
nnn.nnn.nnnn 

и что вы не хотите, чтобы другие варианты, такие как nnn nnn.nnnn или nnn.nnn-nnnn. Попробуйте

Pattern p1 = Pattern.compile("([2-9]\\d{2})([-.])(\\d{3})\\2(\\d{4})"); 
Pattern p2 = Pattern.compile("([2-9]\\d{2})(\\s)(\\d{3})-(\\d{4})"); 

Matcher m = p1.matcher(input); 

if (!m.matches()) 
    m = p2.matcher(input) 
if (m.matches() 
{ 
    // results are in m.group(1), m.group(3) and m.group(4) 
} 
else 
{ 
    // input didn't match 
} 

Объяснение:

p1 
    ([2-9]\\d{2}) - Areacode (first digit must be 2-9) 
    ([-.])   - Delimiter, either a dot or hyphen 
    (\\d{3})  - The 3-digit exchange 
    \\2   - Back-reference to the first delimiter 
    (\\d{4})  - The 4-digit number 

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

Шаблон p2 прост, за исключением того, что я помещаю скобки для скобок вокруг первого разделителя, поэтому индексы числовых групп будут одинаковыми в обоих случаях, исключая необходимость проверки соответствия шаблона.

Смежные вопросы