Регулярное выражение для поиска первых x вхождений буквенных символов, игнорируя все остальное - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь написать Regex для сопоставления первых двух буквенных символов, появляющихся в любом месте строки. Пока мне не удалось добиться желаемых результатов.

Попытки, которые я делал до сих пор, в основном состояли в попытках сгруппировать все, что соответствует A-Za-z, \w, и т. Д. c. но с каждой попыткой я либо ловил скобки, либо скобки, либо останавливался из-за пробелов или символов между двумя алфавитными символами. у меня легко выйти из этого положения, но я действительно хочу научиться делать это с помощью регулярных выражений.

Мои попытки:

[(A-Za-z)]{2} - Не удалось, поскольку он включает () и (U по какой-то причине, которую я не могу понять.

[A-z].*[A-z] - Соответствует всему, что находится между символами

[A-z]?[A-z] - Кажется, уловил кое-что из того, что я хотел, но к сожалению, также обнаруживаются скобки и странное поведение в тесте №2.

[A-Za-z]{2} - ловит первые два связанных буквенных символа, но пропускает все, что содержит что-либо между ними.

[A-Za-z](?:)[A-Za-z] - ловит соединенные алфавитные символы, но не разделенные.

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

Я просмотрел wiki, regex101, regexone, regexr, regular-expressions.info и ссылку, но я просто не могу понять, как сделать это. Я использую движок Regex в Google BigQuery

Тесты:

  1. USUK

Должно точно совпадать US

123U456 KUS

Должно точно совпадать UK

[]() [][(UK]) ( ) [ ] US

Должно точно совпадать UK

]-u K[

Должно точно совпадать uK

Спасибо, что нашли время, чтобы помочь мне.

Ответы [ 2 ]

1 голос
/ 03 августа 2020

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

REGEXP_REPLACE(col, r'^[^A-Za-z]*([A-Za-z])[^A-Za-z]*([A-Za-z]).*', r'\1\2')

См. демонстрацию регулярных выражений

Подробности

  • ^ - начало строки
  • [^A-Za-z]* - 0 или более символов, кроме букв ASCII
  • ([A-Za-z]) - Группа 1 (\1): буква ASCII
  • [^A-Za-z]* - 0 или более символов, кроме букв ASCII
  • ([A-Za-z]) - Группа 2 (\2): буква ASCII
  • .* - остальная часть строки.
0 голосов
/ 03 августа 2020

Я думаю, что приведенный ниже подход намного чище и прост для понимания

SUBSTR(REGEXP_REPLACE(col, r'[^A-Za-z]', ''), 1, 2)   

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

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