Получить часть строки с помощью regex/sql substr

Я пытаюсь извлечь часть моей строки:

выход Полная строка ожидаемый результат xi xi-AN224432_-_this_is_some_text-x10.pdf AN224432 или AN224432_ F1800X7T2P5P xi-F1800X7T2P5P-blahblah-v01_00-EN.pdf F1800X7T2P5P 1Э303С 1E303S-blahblah-v01_20-EN.pdf 1Э303С

Регулярное выражение, которое я пробовал:

select 
    regexp(Fullstring ,'^(xi-)?(\[A-Za-z0-9\]+)-.\*','$2') output  

Это правильно возвращает вторую строку, но не первую.

Мне нужен результат, это буквенно-цифровое число между ними или оно может быть в начале. «xi» необходимо исключить из результата, так как это не буквенно-цифровое число, мне нужно буквенно-цифровое число, если в начале стоит «xi», я хочу получить вторую часть строки, я не понял, почему для второй строка отображалась правильно, но для первой отображалось «xi». третий - лучший вариант, поскольку в начале нет xi.

Объясните, почему xi не подходит? Предоставьте более подробное описание того, что можно и что нельзя сопоставлять.

Justinas 24.05.2024 10:57

Какая у вас база данных SQL (например, MySQL, SQL Server, Oracle, Postgres, DB2)? Нам необходимо это знать, чтобы ответить на ваш вопрос.

Tim Biegeleisen 24.05.2024 10:57

какие базы данных вы используете?

Bending Rodriguez 24.05.2024 10:57

Вы отметили SQL Server. Здесь нет функции regexp, поэтому я удалю этот тег.

Martin Smith 24.05.2024 11:14

«Это правильно возвращает вторую строку, но не первую». Это просто неправда, ваш вопрос; на SQL Server возвращает ошибку «регулярное выражение не является распознаваемым именем встроенной функции». db<>fiddle Вы используете предварительную версию базы данных SQL Azure (в которой, как я полагаю, есть некоторые функции регулярных выражений) или что-то в этом роде?

Thom A 24.05.2024 11:18

@ThomA - Ни один не называется regexpdevblogs.microsoft.com/azure-sql/…

Martin Smith 24.05.2024 11:18

Да, признаюсь, я не знал, каковы были новые (предлагаемые?) имена функций, @MartinSmith.

Thom A 24.05.2024 11:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю, какой вариант регулярного выражения вы используете, обычно мы не выйдет за скобки. Но это может быть связано с синтаксисом ваш механизм регулярных выражений. Вам решать, нужны они вам или нет (также для \* вместо *). Единственный документ, который я нашел, это эта страница о Функция Denodo VQL regexp() и она упоминает синтаксис Java или Perl.

Но чего не хватает, так это необязательного символа подчеркивания «_» в вашем шаблон.

В Perl или PHP это будет: ^(xi-)?(([A-Za-z0-9]+)_?)-.*

Демо здесь: https://regex101.com/r/DCxixu/1

Я добавил группу захвата, чтобы вы могли решить, хотите ли вы использовать полную группу с помощью подчеркивания или если вы хотите ее удалить. Вы могли бы даже замените _? на _*, если их может быть несколько.

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