BigQuery - регулярное выражение для совпадения с числом из 8 цифр после известной строки - PullRequest
1 голос
/ 25 сентября 2019

Мне нужно извлечь 8 цифр после известной строки:

| MyString                     | Extract: | 
| ---------------------------- | -------- | 
| mypasswordis 12345678        | 12345678 | 
| # mypasswordis 12345678      | 12345678 | 
| foobar mypasswordis 12345678 | 12345678 |

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

(?<=mypasswordis.*)[0-9]{8})

Однако, когда я хочу сделать это в BigQueryиспользуя команду REGEXP_EXTRACT , я получаю сообщение об ошибке: «Невозможно разобрать регулярное выражение: недопустимый оператор perl: (? <». </p>

Я искал в библиотеке re2 и увидел, что нет позитивного взгляда назад.

Есть ли способ сделать это, используя другие методы? Что-то вроде

SELECT REGEXP_EXTRACT(MyString, r"(?<=mypasswordis.*)[0-9]{8}"))

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

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

Если регулярное выражение содержитгруппа захвата, функция возвращает подстроку, которая соответствует этой группе захвата. Если выражение не содержит группу захвата, функция возвращает всю подходящую подстроку.

Кроме того,.* шаблон слишком дорогой, вам нужно только сопоставить пробел между словом и цифрами.

Использовать

SELECT REGEXP_EXTRACT(MyString, r"mypasswordis\s*([0-9]{8})"))

Или просто

SELECT REGEXP_EXTRACT(MyString, r"mypasswordis\s*([0-9]+)"))

См. re2 regex online test .

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

Старайтесь не использовать регулярные выражения как можно чаще, это довольно медленно.Попробуйте подстроку и instr в качестве примера:

SELECT SUBSTR(MyString, INSTR(MyString,'mypasswordis') + LENGTH('mypasswordis')+1)

в противном случае Wiktor Stribiżew, вероятно, имеют правильный ответ.

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