2016-09-09 7 views
2

У меня есть текстовые данные в таблице SQL Server 2014, в которых я хочу обнаруживать сложные шаблоны и извлекать определенные части текста, если текст соответствует шаблону. Из-за этого мне нужно захватить группы.Могу ли я использовать группы захвата регулярных выражений в SQL Server 2014?

E.g.
Из текста

"Some title, Some Journal name, vol. 5, p. 20-22" 

Я хочу, чтобы захватить номер тома

, vol\. ([0-9]+), p\. [0-9]+ 

виду, что я упростили этот потребительной случай, чтобы улучшить читаемость. Вышеуказанный случай использования может быть разрешен без групп захвата. Фактический прецедент обрабатывает намного больше исключений, например:

  • Журнал/заголовок, содержащий «том».
  • Номера томов/страницы, содержащие буквы
  • "vol" за которыми следуют ":" или ";" вместо "."
  • ...

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

(^|§|[^a-z0-9])vol[^a-z0-9]*([a-z]?[0-9]+[a-z]?) 

Насколько я знаю, существует два способа получить функциональность Regex в SQL Server.

После установки и настроек всего пакета Master Data Services чувствовал себя излишним, чтобы получить некоторую Regex функциональности, я надеялся, что не было бы легко, общий выход ...

+2

"Я надеялся, что не было бы легко, общий выход »- да CLR. Поддержка регулярных выражений .NET поддерживает захват групп, поэтому напишите нужный вам код и разверните его. –

+0

@MartinSmith: Это уже хорошо знать. Я новичок в SQL Server (от Oracle) и новичок в .NET. Я даже не знаю, что такое CLR *, кроме того, что он может помочь мне использовать функциональность регулярного выражения .NET. Поэтому мне было интересно, есть ли какие-либо решения, которые мне не нужно кодировать. Как ... подключи и играй. Поскольку я предполагаю, что я не первый человек, которому нужна эта функциональность. – Wouter

+0

@Wouter, чтобы узнать больше о работе с SQLCLR в целом, см. Серию, которую я пишу на SQL Server Central по этой теме: [Stairway to SQLCLR] (http://www.sqlservercentral.com/stairway/105855/) (FYI: бесплатная регистрация необходима для чтения контента на этом сайте, но это того стоит :-). –

ответ

2

Я нашел реализацию CLR, которая очень проста в установке и включает в себя функции групповой захвата Regex.

http://www.sqlsharp.com/

Я установил это в отдельной базе данных под названием «SQL #» (просто с помощью прилагаемого установки .sql сценария), а функции расположены в схеме с тем же именем. В результате я могу использовать функцию следующим образом:

select SQL#.SQL#.RegEx_CaptureGroup('test (2005) test', '\((20[012][0-9]|19[5-9][0-9])\)', 1, NULL, 1, -1, ''); 

Было бы хорошо, если бы это было включено по умолчанию в SQL Server ...

+0

Здравствуйте. Я создатель [SQL #] (http://www.SQLsharp.com/) и хотел упомянуть несколько вещей: 1) Недавно я выпустил v 4.0, который включает в себя множество улучшений производительности, включая ** RegEx_CaptureGroup **, 2) теперь есть функция ** RegEx_CaptureGroupCapture **, чтобы получить конкретное повторение определенной группы, 3) Полная версия (т. Е. Не бесплатно) включает в себя TVF ** RegEx_CaptureGroups ** и ** RegEx_CaptureGroupCaptures **, чтобы получить все экземпляры в пределах строка и 4) при работе с символами <= 4k используйте 4k-версии функций RegEx и String для повышения производительности: ** RegEx_CaptureGroup4k ** –

Смежные вопросы