Я пытаюсь вывести строки в верхнем регистре, соответствующие регулярному выражению.
Я попытался:
SELECT
REGEXP_REPLACE(
'I am testing this string',
'(testing|string)',
UPPER('\\1')
);
Что не работает, я предполагаю, что верхнее значение применяется к «\ 1» до того, как оно фактически превратится в первую группу захвата.
Вторая попытка:
SELECT
REGEXP_REPLACE(
'I am testing this string',
'(testing|string)',
UPPER(REGEXP_EXTRACT('I am testing this string', '(testing|string)'))
);
Но на этот раз он применяется только к первому совпадению REGEXP_EXTRACT.
Желаемый результат: Я ПРОВЕРЯЮ эту СТРОКУ
Регулярное выражение в BigQuery не поддерживает изменение вывода с помощью таких функций, как upper. Есть обходные пути. Сначала вы можете заменить каждое слово верхним СЛОВОМ: replace(replace("word for text ","word","WORD"),"text,"TEXT).
Другой подход заключается в маскировании части текста, которая должна быть в верхнем регистре. Подумайте о языке уценки. Все, что между двумя *, будет писаться с большой буквы. Вы можете изменить этот символ на любой другой или комбинацию. REGEXP_REPLACE ищет детали и добавляет * к совпадениям. Эта строка разбивается на каждую * и не вкладывается в переменную X с переменной offset. Если смещение нечетное, текст X пишется с заглавной буквы UPPER. string_agg``concats all parts of the splitted string. The ((SELECT ...))inside the mainSelect` необходим для запуска запроса в запросе.
Select
123 as id,
((SELECT string_agg(if (mod(Offset,2)=1,Upper(x),x),"") from
unnest(split(REGEXP_REPLACE(
'I am testing this string as best as I can do!',
'(testing|string)',
'*\\1*'
),"*")) X with offset))
Рассмотрим ниже подход
create temp function cap_matches(text string, match string) returns string language js as r"""
return text.replace(RegExp(match, 'gi'), word => word.charAt(0).toUpperCase() + word.slice(1));
""";
select 'I am testing this string' text,
cap_matches('I am testing this string', 'testing|string') new_text
С выходом
Или даже проще, если вы хотите использовать заглавные буквы всего совпадающего слова
create temp function cap_matches(text string, match string)
returns string language js as r"""
return text.replace(RegExp(match, 'gi'), word => word.toUpperCase());
""";
select 'I am testing this string' text,
cap_matches('I am testing this string', 'testing|string') new_text
С выходом