RegEx: Как исключить начальные и последующие символы и номера телефонов? - PullRequest
0 голосов
/ 23 сентября 2019

В настоящее время мы создаем надстройку Microsoft Outlook, которая будет активирована на основе регулярного выражения в тексте сообщения электронной почты.Для этого мне необходимо исключить некоторые случаи, описанные ниже.Надеюсь, что кто-то может помочь, потому что я не очень глубокий эксперт по регулярным выражениям.Ниже текущего статуса и спрашивает.Если есть более разумный способ определения выражения регулярного выражения, я рад любому альтернативному способу.К вашему сведению: я использую https://regex101.com/ тестер.

Заранее спасибо!

(1) Совпадение, если:

(a)… число не менее 6 и не более 10 цифрНапример,

1234567

1234567891

1234567890 1234567890

ОК,я думаю, что это \ d [0-9] {5,9}

И

(b)… следующий символ - полный останов, пробел или косая черта, например

12 3456789012. Полные остановки

12 3456789012 Пробел

12 3456789012 / 2019 Косая черта

ОК, я думаю, что это \ d [0-9] {5,9} плюс позитивный прогноз, значит \ d [0-9] {5,9} (? = |. | /)

(2) Нет соответствия, если…:

(a)… строка является частью строки, в которой в качестве предшественника используется запятая или плюс, например,

, 1234567890

+ 1234567890

К сожалению, для активации надстроек Office Microsoft допускает только упреждающие утверждения в регулярных выражениях, но не опосредованные, (? <= Text) и отрицательный look-b.ehind.Есть ли какой-нибудь альтернативный способ? </p>

(b)… следующий символ - #, например,

1234567890 #

(c)… международный телефонный номер найден. + (?: [0-9]?) {6,14} [0-9] «/> и ^ + (?: [0-9] ⋅?) {6,14} [0-9] $, чтобы соответствовать международным телефонным номерам, ноопять же не знаю, как поместить это в строку, чтобы использовать это для исключения.То, что я пытаюсь использовать в качестве основы для несоответствия, заключается в следующем (основываясь на том, как я нашел телефонные номера, обычно записанные в электронных письмах моего клиента):

До 4 элементов группы номеров, первый элемент которой начинается с+ или 00, за которыми следуют одна, две или три цифры, например

+ 1 1234567890

+ 49 1234567890

+ 353 1234567890

Найдено следующее утверждениево время моего исследования, чтобы достичь этого, но опять же не знаю, где поместить его в строку: + [0-9] {1,} | 0) [1-9] {2,} | 0) [1-9] {3,}…

Также:

+ 49 12 3456789012 2x Blank

+ 49 12 345 6789012 3x Blank

Вместо пустых групп сследующие символы также могут привести к несоответствию.

+ 49-12-345-6789012 Минус

+ 49/12/345/6789012 Косая черта

(d)…Другие форматы телефонных номеров, начинающиеся с 0

До 4 элементов группы номеров, первый элемент которой начинается с 0, за которым следуют три или четыре цифры, например,

0151 1234567890

02351 1234567890

Вместо пробелов группы со следующими символами также должны приводить к несовпадению.

0151-1234567890 Минус

0151 /1234567890 Косая черта

1 Ответ

0 голосов
/ 23 сентября 2019

Ваш первый случай:
вы хотите выбрать номер, если он имеет от 6 до 10 цифр (включительно) и не более.
у вашего решения \d[0-9]{5,9} есть 2 проблемы:

  • вы выбираете все числа от 5 до 9 цифр
  • вы не проверяете, есть ли у номера большечем 10 цифр

Чтобы убедиться, что мы выбираем от 6 до 10 цифр, мы можем использовать \d[0-9]{6,10} и чтобы убедиться, что нет других цифр, кроме тех, которые мы выбрали, мы используем группы без захвата (?:^|\D) для проверки нецифровых символов в начале выделения.

Ваша идея использовать позитивный взгляд на пробелы и слэши работает, но стоит дорого (не используйте их для одиночных символов), вы можетевместо этого просто добавьте [ \/] после вашей группы захвата, чтобы убедиться, что за вашей группой захвата следует либо пробел, либо косая черта

Таким образом, вы можете использовать (?:^|\D)(\d{6,10})[ \/] для вашего первого случая.

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

Глядя на упомянутые проблемы -

  • вам не нужно смотреть негативно (опять же очень дорого), вы можете использовать [^abc] перед вашей группой захвата, чтобы обеспечитьчто он не следует за символами a, b или c (реализация зависит от вас).

  • То же самое можно использовать после вашей группы захвата (чтобы убедиться, что за вашим номером не следует знак фунта)

  • Это гдевсе становится сложно, было бы намного проще, если бы у вас был общий определенный шаблон (или шаблоны) для ваших международных номеров, в этом случае вы могли бы создать регулярное выражение для идентификации и игнорирования каждого набора примеров, которые вы предоставили.(это лучший случай, который я могу обдумать, я надеюсь, что кто-то может предложить более элегантное решение)

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

* PS - Stackoverflow - это не сайт, где люди просят вас сделать вашу работу, а помогают прояснить недопонимание, которое вы можете иметь с кодом, который вы пытались внедрить, иличтобы лучше понять концепции, связанные с развитием.

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