Żona zadała mi pytanie w związku z rozwijanym w firmie systemem pisanym w C# i opartym o SQL Server: jakimi sposobami z ciągu znaków np. „kkk/384/d3/a/332” można wyciągnąć liczby po ostatnim znaku „/”?
Do głowy przychodzą mi dwa rozwiązania:
- wyszukać ostatnie pojawienie się znaku „/” i odpowiednio wyciąć string
- zastosować wyrażenie regularne do znalezienia cyfr na końcu ciągu
W przypadku SQL Servera nie ma wbudowanych bibliotek do wyrażeń regularnych. Można napisać własne funkcje wykorzystujące SQLCLR (dla wersji 2005 i 2008) lub OLE (dla wersji 2000) lub skorzystać z istniejących zewnętrznych bibliotek dll (np. xp_pcre). W tym konkretnym przypadku można jednak osiągnąć zamierzony wynik żonglując standardowymi funkcjami T-SQL.
Weźmy nasz przykładowy string „kkk/384/d3/a/332”. W poszczególnych kolumnach pokazane są wyniki kolejnych kroków:
declare @sKod varchar (100) set @sKod = 'kkk/384/d3/a/332' SELECT @sKod, REVERSE(@sKod), CHARINDEX('/', REVERSE(@sKod)), LEN(@sKod) - CHARINDEX('/', REVERSE(@sKod)) + 1, SUBSTRING(@sKod, LEN(@sKod) - CHARINDEX('/', REVERSE(@sKod)) + 2, 100)
Dla C# można wykorzystać oba proponowane podejścia wykorzystując Regex.Match lub Substring + LastIndexOf:
using System; using System.Text.RegularExpressions; namespace LiczbyZKonca { class Program { static void Main(string[] args) { string sKod1 = "var/01/09"; string sKod2 = "OLEDB/1123"; string sKod3 = "H/102/e/456"; Console.WriteLine("Dopasowanie 1: {0} ==> {1}", sKod1, Regex.Match(sKod1, "([0-9])+$").Value); Console.WriteLine("Dopasowanie 2: {0} ==> {1}", sKod2, Regex.Match(sKod2, "([0-9])+$").Value); Console.WriteLine("Dopasowanie 3: {0} ==> {1}", sKod3, Regex.Match(sKod3, "([0-9])+$").Value); Console.WriteLine("Dopasowanie 1a: {0} ==> {1}", sKod1, sKod1.Substring(sKod1.LastIndexOf("/") + 1)); Console.WriteLine("Dopasowanie 2a: {0} ==> {1}", sKod2, sKod2.Substring(sKod2.LastIndexOf("/") + 1)); Console.WriteLine("Dopasowanie 3a: {0} ==> {1}", sKod3, sKod3.Substring(sKod3.LastIndexOf("/") + 1)); Console.ReadKey(); } } }
Dla porządku należy wyjaśnić, że zapis wyrażenia regularnego ([0-9])+$ oznacza: znajdź na końcu ($) przynajmniej jedną (+) cyfrę ([0-9])