2016-09-13 3 views
2

Я пытаюсь форматировать номера телефонов в большом CSV-каталоге. Мне нужно будет повторно форматировать это периодически, поскольку оно изменяется, поэтому это не одноразовое решение. Я использовал функцию замены регулярных выражений Notepad ++ в прошлом и хотел бы использовать этот инструмент, если это возможно. Тем не менее, я открыт для лучших/быстрых методов, включая скрипты вроде PowerShell, с которыми я знаком.Использование Notepad ++ Regex для форматирования телефонных номеров

Пример форматов номеров в базе данных:
XXXXXXX
XXXXXXX
XXXXXXXXXX
1XXXXXXXXXX
(XXX) XXXXXXX
1 (XXX) XXXXXXX
(1XXX) XXX-XXXX
XXX-XXX-XXXX

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

Вот некоторые из регулярных выражений поиска, которые я использовал:
FIND: 1-(\d{3})-(\d{3})-(\d{4})
ЗАМЕНА: \ 1 \ 2 \ 3
Это работает!

FIND: 1\((\d{3})\)\s(\d{3})-(\d{4})
ЗАМЕНА: \ 1 \ 2 \ 3
Это работает!

НАЙТИ: (\d{11})
REPLACE: ???
Это находит правильную строку, но я не знаю, как отформатировать вывод.

FIND: (\d{3})-(\d{4})
ЗАМЕНА: xxx- \ 1 \ 2 (здесь XXX мой стандартный код города, который я добавлю)
Это находит правильную подстроку в XXX-XXX-XXXX, а также xxx- XXXX и почтовые индексы с добавлением +4 (XXXXX-XXXX). Вам нужно просто найти XXX-XXXX без чего-либо предшествующего ему и только с телефонных номеров. Поскольку это CSV-файл, фактический символ перед каждым полем является запятой.

Моя проблема двоякая. 1) Я не знаю, как разбить найденную строку на части, которые мне нужны для замены. Мне нужно преобразовать блоки цифр (7, 10 и 11 цифр) и отформатировать их в соответствии с шаблоном XXX-XXX-XXXX. 2) Я не знаю, как выбрать только строку, которую я ищу (т.е. только XXX-XXXX)

ответ

2

При условии, у вас есть список выборки чисел, например

Current    Expected 
--------------------------------- 
123-1234   XXX-123-1234 
1234567    XXX-123-4567 
1234567890   123-456-7890 
1-345-6789 
(123) 456-1234  123-456-1234 
1(123) 123-1234  123-123-1234 
1-123-123-1234  123-123-1234 
(1999) 999-1234  999-999-1234 
123-123-1234  123-123-1234 

Вы можете использовать

Найти Что: ^(?:1-?)?(?|\(1?(\d{3})\)|(\d{3}))[-\s]?(\d{3})[-\s]?(\d{4})$|^(\d{3})[-\s]?(\d{4})$
Заменить С: (?1$1-$2-$3:XXX-$4-$5)

enter image description here

Деталь:

  • ^ - начало строки
  • (?:1-?)? - необязательная последовательность 1 и необязательной -
  • (?|\(1?(\d{3})\)|(\d{3})) - группа сброс ветви (синтаксис (?|...), все группы внутри альтернатив филиалы получают одинаковые идентификаторы):
    • \(1?(\d{3})\) - ( + дополнительный 1 + 1-й группы, захватив 3 цифры + )
    • | - или
    • (\d{3}) - Группа 1 (до сих пор!из-за ветвь группы сброса) захват 3 цифры
  • [-\s]? - 1 или 0 (факультативно) - или пропусков
  • (\d{3}) - Группа 2 захватив 3 цифры
  • [-\s]? - дополнительный - или пробельные
  • (\d{4}) - 3-й группы, захватив 4 цифры
  • $ - конец строки
  • | - ИЛИ
  • ^ - начало строки
  • (\d{3}) - Группа 4 захватив 3 цифры
  • [-\s]? - дополнительный - или пробельные
  • (\d{4}) - Группа 5 захвата 4 цифры
  • $ - конец линии

Образец замены:

  • (?1 - Если группа 1 совпадают, а затем использовать
    • $1-$2-$3 - обратная ссылка на группы 1, 2 и 3 с дефисом между ними
  • : - либо
  • XXX-$4-$5 - XXX (или независимо от кода страны), а группы 4 и 5 разделены дефисом.
  • ) - конец if-then блок.
1

Я не знаком с powershell, но да, было бы неплохо сделать небольшой скрипт для сделайте это для вас.

Для блокнота подхода, хотя, я бы попытаться запустить дважды заменить:

  1. FIND: (?:^|,)(\d{3})[ -]?(\d{4})(?:,|$)

    ЗАМЕНЫ: XXX-\1-\2 где XXX это ваш входной код

  2. область
  3. НАЙТИ: \(?1?\(?(\d{3})\)?[ -]?(\d{3})[ -]?(\d{4})

    ЗАМЕНЫ: \1-\2-\3

Я не думаю, что вопросы порядка. Сначала попробуйте в тестовом файле.

Я не уверен, что вы подразумеваете под своим вторым вопросом, являются ли регулярные выражения для выбора чисел из неправильного столбца в csv? (Если это так, что это еще одна причина, почему сценарий будет лучше)

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