Жадное регулярное выражение несовместимо с postgresql?(Подстрока соответствует) - PullRequest
0 голосов
/ 03 января 2019

Я пытался сделать Regex для извлечения некоторой информации с помощью функции SUBSTRING, но REGEX, который я пробовал на https://regex101.com/r/cFy11t/1, возвращает сообщение об ошибке в postgresql: «Операнд квантификатора недействителен»

Цель этой подстроки состоит в том, чтобы извлечь последнее число в строке и включить дополнение как «A, B ... G или BIS, TER», если число похоже на «12B улицы X».Если в строке несколько чисел, следует выбрать последнее, за исключением случая, когда последнее находится в конце строки.

Например, в строке «123 47F ABC 33 BIS» результатдолжно быть "47F"

Я уже сильно изменил код, так как не получил ожидаемый результат, но я получаю только ошибку, так как принудительно установил жадный квантификатор "++" и "? + "чтобы получить письмо, если это возможно

Итак, вот последняя версия моего кода, где postgres выдает ошибку: (но вы можете нажать на ссылку вверх, чтобы увидеть ее цветом, она может быть более понятной)

SELECT SUBSTRING(Adresse, '(\d++((?:\s)?([A-G]|BIS|TER|QUARTER)?+\s)(?!$))(?!(.*\d+(\s)?[A-G]?+\D))')  Numero,

...

Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вы можете использовать

'^.*\y(\d+(?!\s?(?:BIS|TER|QUARTER|[A-G])$)\s?(?:BIS|TER|QUARTER|[A-G])?\y)'

См. Онлайн-демонстрацию

Главное - избавиться от собственнических квантификаторов и убедиться, что вы применяете конец строкипроверка с учетом того, что шаблоны трейлинга являются необязательными.

Подробности

  • ^ - начало строки
  • .*\y -любые 0+ символов, как можно больше, вплоть до последней границы слова (с последующим ...)
  • (\d+(?!\s?(?:BIS|TER|QUARTER|[A-G])$)\s?(?:BIS|TER|QUARTER|[A-G])?\y) - группа 1 (возвращается SUBSTRING):
    • \d+ - 1+ цифр
    • (?!\s?(?:BIS|TER|QUARTER|[A-G])$) - без дополнительного пробела и затем BIS, или TER, или QUARTER, или буква от A до G в конце строки
    • \s? - необязательный пробел
    • (?:BIS|TER|QUARTER|[A-G])? - необязательное совпадение для BIS, TER, QUARTER или aбуква от A до G
    • \y - граница слова.
0 голосов
/ 03 января 2019

Я не мог ясно понять ваш вопрос, но все же, я попробовал.Если мой ответ неверен, я был бы признателен за несколько примеров с желаемым результатом.

Regex: '(\d+[A-G]+)'

Ссылка на пример: https://regex101.com/r/cFy11t/4

Обновление:

Новое регулярное выражение: '(?:\d+\w(?=\s\d+[A-z]{2,}))|(\d+[A-z])(?=\s\d+[A-z])'

Ссылка на пример: https://regex101.com/r/cFy11t/11

Надеюсь, это удовлетворит ваше требование.Если нет, дайте мне знать.

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