Lex / Flex - Разделить номер телефона вверх?

Я делаю программу, которая должна разделить телефонный номер на части, каждая часть была разделена дефисом (или пробелами, или '()' или пустым).

Exp: Input: 0xx-xxxx-xxxx or 0xxxxxxxxxx or (0xx)xxxx-xxxx Output: code 1: 0xx code 2: xxxx code 3: xxxx Но моя проблема в том, что иногда «Код 1» - это просто 0x -> поэтому «Код 2» должен быть xxxxx (в первой части всегда есть дефис или круглые скобки, если длина 2 цифры)

Кто-нибудь может мне помочь, Буду признателен.


person Kingcesc    schedule 26.08.2014    source источник
comment
В случае, когда Code1 состоит всего из двух цифр, всегда ли у вас есть дефис или круглые скобки? (т.е., когда нет разделителя, всегда ли Code1 состоит из трех цифр?)   -  person Aserre    schedule 26.08.2014
comment
вообще ничего, я все еще работаю над этим.   -  person Kingcesc    schedule 26.08.2014
comment
@Ploutox Да, у них всегда есть дефис или круглые скобки, когда они состоят из двух цифр.   -  person Kingcesc    schedule 26.08.2014
comment
Можно ли поставить скобку где-нибудь в своем номере? (012)(3456)(7890) допустимы или круглые скобки только для первой группы? Можно (012)-xxxx-xxxx (с дефисом после скобок)? Будете ли вы проверять свое регулярное выражение на неправильные форматированные числа или вы просто будете использовать его для извлечения данных из правильно сформированных чисел?   -  person Aserre    schedule 26.08.2014
comment
Вы просто набираете номера в США?   -  person meaning-matters    schedule 26.08.2014
comment
Нет, @Ploutox. Каждую часть можно разделить только одним типом разделителя. И скобки только для первого. К счастью, в функции нет неверно оформленных входных данных. Извините за мой вопрос, было пропущено так много информации.   -  person Kingcesc    schedule 26.08.2014


Ответы (1)


Согласно вашим комментариям, следующее регулярное выражение извлечет необходимую вам информацию.

^\(?(0\d{1,2})\)?[- ]?(\d{4,5})[- ]?(\d{4})$

Авария:

  • ^\(?(0\d{1,2})\)? соответствует 0x, 0xx, (0xx) и (0x) в начале строки
  • [- ]? круглые скобки могут использоваться только для первой группы, единственные допустимые разделители - это пробел и дефис. ? означает 0 или 1 раз.
  • (\d{4,5}) будет соответствовать второй группе. Поскольку длина третьей группы фиксирована (4 цифры), регулярное выражение автоматически вычисляет длину групп Group1 и 2.
  • (\d{4})$ соответствует 4 цифрам в конце номера.

Посмотреть в действии

Вы можете извлечь данные из группы захвата 1,2 и 3

Примечание. Как упоминалось в комментариях к OP, это извлекает данные только из правильно сформированных чисел. Он будет соответствовать некоторым неправильно сформированным числам.

person Aserre    schedule 26.08.2014