sobota, 10 sierpnia 2013

[C#|Visual Studio] Regex

W tym poście przedstawione zostaną podstawowe przypadki użycia klasy System.Text.RegularExpressions.Regex. Najprostszy sposób użycia, to sprawdzenie, czy tekst zawiera dany ciąg znaków z opcją CaseSensitive lub bez niej.

var bloodBrothers = new string[]
                           {
                               "And if you're taking a walk through the garden of life",
                               "What do you think you'd expect you would see?",
                               "Just like a mirror reflecting the moves of your life",
                               "And in the river reflections of me",

                               "Just for a second a glimpse of my father I see ",
                               "And in a movement he beckons to me",
                               "And in a moment the memories are all that remain",
                               "And all the wounds are reopening again"
                           };

            var pattern = "and";

            foreach (var s in bloodBrothers)
            {
                if(System.Text.RegularExpressions.Regex.IsMatch(s, pattern, RegexOptions.IgnoreCase))
                {
                    Console.WriteLine(s);
                }
            }

Wszystkie stringi rozpoczynające się od danego ciągu znaków:

pattern = "^(And in a).*";

Wszystkie stringi kończące się na danym ciągu znaków:

pattern = "life$";

Wyrazy dłuższe niż 10 znaków:

pattern = "[A-Z|a-z]{10,}";

Numery telefonu, oddzielone znakiem "-" rozpoczynające się od 3 cyfr a kończące na czterech ([0-9] i \d są równoważne)

pattern = "^([0-9]{3})-.*-\\d{4}$";

Trzy takie same cyfry (nawiasy oznaczają grupę,do której następnie odwołujemy się poprzez \1 z krotnością 2, pytajnik oznacza opcjonalność danego znaku)

pattern = "-?(\\d)(\\1){2}-";

Negacja - wszystkie linie nie zaczynające się od A

pattern = "^[^A]";

Skróty znakowe:




Białe spacje i granice wyrazu:

pattern = "\\bdo\\b\\s\\byou\\b";

Case - insensitive z poziomu wzorca:

pattern = "(?i)what";

Linie zakończone pytajnikiem (przy użyciu Unicode)

pattern = "\\u003F$";

Kwantyfikatory:


Lookaheads i lookbehinds:

pattern = "(?=[a-z]{2} life).{2}";

Pattern taki poszuka wszystkich dwuliterowych napisów, po których w dowolnym miejscu w tekście występuje słowo life. Wzorzec ma zerową długość, a więc ostatnia instrukcja {2} oznacza, że wybrane zostaną właśnie te dwuliterowe wyrazy. Pozostałe możliwości to:

  • ?! - negative lookahead
  • ?<=  - lookbehind 
  • ?<! - negative lookbehind

Brak komentarzy:

Prześlij komentarz