Regex (Все после первого матча (без первого матча)) - PullRequest
1 голос
/ 19 марта 2020

Я борюсь с легким выражением Regex. В основном я хочу все после первого совпадения «_» без «_».

Мое текущее выражение выглядит так: _(.*)

Когда я даю ввод: AAA_BBB_CCC

Вывод: _BBB_CCC

Мой идеальный вывод будет: BBB_CCC

Я использую базу данных типа "снежинка" со встроенной функцией регулярных выражений.

К сожалению, я не могу использовать (?<=_).*, так как он не поддерживает этот формат "? <=". Есть ли другой способ, как я могу изменить <code>_(.*), чтобы получить правильный вывод?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 19 марта 2020

Вы можете использовать регулярное выражение для достижения этой цели, например, JavaScript, например, сделает работу

"AAA_BBB_CCC".replace(/[^_]+./, '')

Используйте REGEXP_REPLACE со Snowflake

regexp_replace('AAA_BBB_CCC','^[^_]+_','')

https://docs.snowflake.net/manuals/sql-reference/functions/regexp_replace.html

Но вы также можете найти первый индекс _ и использовать подстроку, доступную на всех языках

let text = "AAA_BBB_CCC"
let index = text.indexOf('_')
if(index !== -1 && index < text.length) {
    let result = text.substring(index+1)
}
1 голос
/ 19 марта 2020

В Snowflake SQL вы можете использовать REGEXP_SUBSTR, его синтаксис

REGEXP_SUBSTR( <string> , <pattern> [ , <position> [ , <occurrence> [ , <regex_parameters> [ , <group_num ] ] ] ] ).

Функция позволяет вы должны вернуть захваченные подстроки :

По умолчанию REGEXP_SUBSTR возвращает всю соответствующую часть объекта. Однако, , если указан параметр e (для «извлечения»), REGEXP_SUBSTR возвращает ту часть субъекта, которая соответствует первой группе в шаблоне. Если указано e, но group_num также не указано, то group_num по умолчанию равно 1 (первая группа). Если в шаблоне нет подвыражения, REGEXP_SUBSTR ведет себя так, как если бы e не установлено.

Итак, вам нужно установить regex_parameters в e и - опционально - group_num в качестве аргумента 1:

Select REGEXP_SUBSTR('AAA_BBB_CCC', '_(.*)', 1, 1, 'e', 1)
Select REGEXP_SUBSTR('AAA_BBB_CCC', '_(.*)', 1, 1, 'e')
0 голосов
/ 19 марта 2020

Чтобы это действительно заработало, вам нужно использовать:

SELECT REGEXP_SUBSTR('AAA_BBB_CCC', '_(.*)', 1, 1, 'e', 1);

, что дает:

REGEXP_SUBSTR('AAA_BBB_CCC', '_(.*)', 1, 1, 'E', 1)
BBB_CCC

вам нужно передать параметр REGEXP_SUBSTR <regex_parameters> e, то есть extract sub-matches., таким образом, ответ Виктора на 95% правильный.

0 голосов
/ 19 марта 2020

Использовать группу захвата:

\_(?<data>.*)

, которая возвращает группу захвата data, содержащую BBB_CCC

Пример: https://regex101.com/r/xZaXKR/1

...