Znajdź ostatnie n znaków

Ż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])

Advertisements

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s