Регулярное выражение для извлечения строки после просмотра «число + одна буква + [запятая или пробел]» в Bigquery - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь извлечь:

Роща Аббатства
Роща Аббатства
Вид на Эбби Роуд
Река Эбби
Терраса Эбби
Эбби Вуд Роуд
Роща Эбби

из

23a, Abbey Grove
43a Abbey Grove
Block 509a Abbey Road View
511 Abbey Road
Flat 8a, Abbey Terrace
14 Abbey Wood Road
100 Abbey Grove

в Google Bigquery. Проблема в том, что:

regexp_replace(text, '[^a-zA-Z]', '')

дает мне "aabbeywood" с двумя очками. По сути, я просто хочу сохранить весь текст после строки "цифра c" или "цифра c плюс одна буква".

Ответы [ 3 ]

1 голос
/ 06 января 2020
SELECT regexp_replace(t, '.*[0-9]+[a-zA-Z]?[^a-zA-Z]*', '') FROM UNNEST(['23a, Abbey Grove','43a Abbey Grove','Block 509a Abbey Road View','511 Abbey Road','Flat 8a, Abbey Terrace','14 Abbey Wood Road','100 Abbey Grove']) t

Я попытался воспроизвести проблему с вашими данными. Для этих специфических c данных он работал в BigQuery.

Это регулярное выражение можно перевести как:

  1. Поиск любых символов ноль или более раз
  2. Поиск чисел один или несколько раз
  3. Поиск для нуля или одной буквы между a и z (нижний или верхний)
  4. Поиск любого символа, который не является буквой ноль или более раз

У вас есть несколько различных случаев, когда это регулярное выражение не применяется, пожалуйста, дайте мне знать. Я надеюсь, что это поможет

0 голосов
/ 06 января 2020

Пожалуйста, отметьте это, может быть, это вам поможет.

1) Создайте одну функцию

CREATE FUNCTION dbo.RemoveChars(@Input varchar(1000))
RETURNS VARCHAR(1000)
BEGIN
  DECLARE @pos INT
  SET @Pos = PATINDEX('%[^a-z A-Z]%',@Input)
  WHILE @Pos > 0
   BEGIN
    SET @Input = STUFF(@Input,@pos,1,'')
    SET @Pos = PATINDEX('%[^a-z A-Z]%',@Input)
   END
  RETURN @Input
END
GO

После создания запустите функцию под запросом

DECLARE @Tabel TABLE(
    Text VARCHAR(250)
)

INSERT INTO @Tabel 
VALUES('23a, Abbey Grove'),
('43a Abbey Grove'),
('Block 509a Abbey Road View'),
('511 Abbey Road'),
('Block 8a, Abbey Terrace'),
('14 Abbey Wood Road'),
('100 Abbey Grove')

SELECT dbo.RemoveChars(Text) AS Text FROM @Tabel
0 голосов
/ 06 января 2020

Это нелегко, потому что я не знаю всех ваших ограничений (например, могут ли названия улиц содержать числа? Могут ли быть другие слова, кроме «Блокировать» перед номером?). Вот регулярное выражение, которое работает для данных примеров (вы можете получить названия улиц из group3):

^(Block ){0,1}([0-9]+[A-Z|a-z]{0,1}[,]{0,1} )([a-z|A-Z| ]+)

См. эту ссылку для примера.

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