Несколько совпадений в верхнем регистре в REGEXP_REPLACE в BigQuery

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

Я попытался:

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.

Желаемый результат: Я ПРОВЕРЯЮ эту СТРОКУ

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Регулярное выражение в 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

С выходом

Другие вопросы по теме