Два шаблона в одном регулярном выражении - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь объединить регулярное выражение для двух случаев в запросе к базе данных ClickHouse:

  1. До символа "@" => (^[^@]+)
  2. Без домена ' company \ 'и' company.com \ '=> (?:company\.com\\\\\\\\+|company\\\\\\\\+)(.*)

У меня есть два способа, которые я нашел с помощью "regex online":

  1. ^company\\\\(.*)|^(.*)@|^(?!company\\\\.*).*$
  2. (?<=company\\\\)(.*)|(.*)(?<=@)|^(?!company\\\\.*).*

Но конструкции ?! и ?<= не поддерживаются (ошибка: недопустимый оператор perl). Я использовал команду extract, например extract(User, '(?<=company\\\\)(.*)|(.*)(?<=@)|^(?!company\\\\.*).*')

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

В скобках - должно пройти, из - не следует:

  1. компания \ [AB C -1D2E]
  2. [AB C -DE] @ company.com
  3. [ 123-ABCDE]
  4. [12345]

1 Ответ

0 голосов
/ 01 апреля 2020

Похоже, нужно использовать несколько последовательных вызовов replaceRegexpOne :

SELECT str,
    replaceRegexpOne(str, '(.*company\\\\)(.*)', '\\2') preliminary_result_1,
    replaceRegexpOne(preliminary_result_1, '(.*)(@company.com)', '\\1') result
FROM (
    /* test data */
    SELECT arrayJoin([
        'company\\ABC-1D2E',
        'ABC-DE@company.com',
        '123-ABCDE',
        '12345'
        ]) str
)
/* result:
┌─str────────────────┬─preliminary_result_1─┬─result────┐
│ company\ABC-1D2E   │ ABC-1D2E             │ ABC-1D2E  │
│ ABC-DE@company.com │ ABC-DE@company.com   │ ABC-DE    │
│ 123-ABCDE          │ 123-ABCDE            │ 123-ABCDE │
│ 12345              │ 12345                │ 12345     │
└────────────────────┴──────────────────────┴───────────┘
*/
...