Wyrażenia regularne - ściągawka

by Piotrosz 8. March 2009

Ściągawka z wyrażeń regularnych

^ Początek ciągu e.g. ^abc dopasuje abcd, ale nie aabc
$ Koniec ciągu, e.g do abc$ pasuje xxxabc, ale nie abcxx
[abc] Oznacza: a lub b lub c
[^] Wewnątrz kwantyfikatora ([]) daszek oznacza negację e.g. [^\w] oznacza wszystkie nie-słowa, a[^qwerty] - neguje wszystkie znaki wewnątrz nawiasu kwadratowego
\w+ Dopasowuje każdą grupę znaków, które składają się na słowa
\W Znak niebędący literą ani cyfrą, odpowiednik [^a-zA-Z0-9_]
\S Znak niebędący znakiem białym, odpowiednik [^\f\n\r\t\v]
\s Znak biały (np. spacja, tab), odpowiednik [\f\n\r\t\v]
\D Znak niebędący cyfrą, odpowiednik [^0-9]
\d Dowolna cyfra, odpowiednik [0-9]
[a-z] Dowolna litera z zakresu od a do z
[A-Z] Dowolna wielka litera z zakresu od A do Z
x|y Dopasowuje x lub y, e.g. kot|s pasuje do kot i kos, (he|gie)niek pasuje do heniek i gieniek To samo co [xy]
\d Dowolna cyfra, odpowiednik [0-9]
\d{5} Pięć cyfr (przykład), możliwe są też takie przykładowe zastosowania nawiasu: {0,}, {1,}, {1, 6}
. Dowolny 1 znak (oprócz znaku końca linii), e.g. a.b
* Dowolna ilość znaków po jakimś znaku (także zero), odpowiednik {0,} e.g. a (bc)*
+ Jeden znak lub więcej po jakimś znaku zo+ pasuje do zo oraz zoo, ale nie do z, odpowiednik {1,}
? Jeden znak, ale opcjonalnie (czyli jeden lub zero), odpowiednik {0,1}, e.g. abc? pasuje do abc lub abcd, ale nie do abccc
\b Word boundary e.g. car\b pasuje do tttcar, ale nie do carksjlj
\B Non word boundary e.g. car\B pasuje do cardsss, ale nie do sssscar
\< Odpowiednik \b na początku słowa (flavor specific)
/> Odpowiednik \b na końcu słowa (flavor specific)
\numer Backreference np. \1, \2, \3, ... na przykład \w\1 znajduje podwojone słowa
\k<name> Named Backrefence
(?<name>pattern) Nazwanie wyrażenia

Zastępowanie tekstu:

$numer Zastępuje ostatni podciąg dopasowany przez wyrażenie o numerze numer
${nazwa_wyrazenia} Zastępuje ostatni podciąg dopasowany przez nazwane wyrażenie (<? nazwa_wyrazenia>)
$$ Zastępuje pojedynczy znak $
$& Zastępuje kopię dopasowanego ciągu
$` Zastępuje cały ciąg wejściowy poprzedzający dopasowanie
$' Zastępuje cały ciąg wejściowy za dopasowaniem
$+ Zastępuje ostatnią dopasowaną grupę
$_ Zastępuje cały ciąg wejściowy

Przykłady

Wyszukanie wszystkich ciągów złożonych z litery q nie poprzedzonej literą q (czyli dowolnym znakiem niebędącym literą u):

q[^u]

Dopasowanie dowolnego słowa w nawiasach (znaki ( oraz ) są znakami specjalnymi i dlatego trzeba zastosować backslash):

\([a-zA-Z]+\)

Dowolna nazwa pliku z rozszerzeniem .php i dwoma parametrami przekazywanymi poprzez GET (poprzez query string):

\w\.php?[&=\w]{2}

Godzina w formacie 12:33 am (uwaga na spację przed (am|pm)):

(1[012]|[1-9]):[0-5][0-9] (am|pm)

Adres e-mail:

^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$

Tag HTML:

<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>

Adres IP:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0 -9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Powtarzające się litery (przykład z named backreference):

(?<znak>\w)\k<znak>

Powtarzające się słowa (przykład z named backreference):

(?<słowo>\s\w+)\k<słowo> Dopasuje ba ba, ale też ba baxxx.

Ulepszona wersja: (?<słowo>\s\w+)\k<słowo>\b dopasuje tylko oddzielne powtarzające się słowa (e.g. do domu).

Regex w C# .NET

Programik konsolowy do testowania różnych wyrażeń regularnych. Jako parametry wywołania należy podać ciąg znaków i wyrażenie regularne:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace RegularExpressions
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length == 2)
            {
                if (Regex.IsMatch(args[1], args[2]))
                {
                    Console.WriteLine("Matches");
                }
                else
                {
                    Console.WriteLine("Does not match");
                }
            }
        }
    }
}

Filtrowanie (parsowanie) tekstu:

 // dumping, extracting from file
 private static List<string> RegexFind(string contents)
 {
    List<string> result = new List<string>();
    Regex r = new Regex(@"'(linkphp\.php\?[&=\w]{2,})'");
    Match m;
    for (m = r.Match(contents); m.Success; m = m.NextMatch())
    {
        result.Add(m.Groups[1].ToString());
    }
    return result;
 }

Zastępowanie wyrażeń w tekście. Poniższy przykład zastępuje daty w formacie dd/MM/yyyy na datę w formacie dd-MM-yyyy:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace RegexReplacingText
{
    class Program
    {
        static void Main(string[] args)
        {
            string DtFrom = "12/22/2008";
            Console.WriteLine(ReplaceDate(DtFrom));
        }

        private static string ReplaceDate(string input)
        {
            return Regex.Replace(input, @"\b(?<miesiac>\d{1,2})/(?<dzien>\d{1,2})/(?

<rok>\d{1,4})\b", "${dzien}-${miesiac}-${rok}");
        }
    }
}
Usuwanie tagów HTML z tekstu (HTML tags stripping):
public static string StripHtmlTags(string input)
{
    return Regex.Replace(input, "<.*?>", string.Empty);
}
Wyrażenie tutaj jest uproszczone, ale działa w większości przypadków.

Comments

4/12/2009 11:07:25 PM #

trackback

Trackback from dotnetomaniak.pl

Piotrosz | Wyrażenia regularne - ściągawka

dotnetomaniak.pl

11/1/2009 3:46:21 PM #

pingback

Pingback from prosupport.pl

WyraĹĽenia regularne | Lachonarium u Mumina - Programowanie PHP, MySQL, EDI, ECR  

prosupport.pl

Comments are closed

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen