JavaRush /Blog Java /Random-PL /RegEx: 20 krótkich kroków do opanowania wyrażeń regularny...
Artur
Poziom 40
Tallinn

RegEx: 20 krótkich kroków do opanowania wyrażeń regularnych. Część 3

Opublikowano w grupie Random-PL
RegEx: 20 krótkich kroków do opanowania wyrażeń regularnych. Część 1. RegEx: 20 krótkich kroków do opanowania wyrażeń regularnych. Część 2: W tej części przejdziemy do rzeczy nieco bardziej złożonych. Ale opanowanie ich, jak poprzednio, nie będzie trudne. Powtarzam, że RegEx jest tak naprawdę łatwiejszy, niż mogłoby się początkowo wydawać i nie trzeba być naukowcem zajmującym się rakietami, aby go opanować i zacząć stosować w praktyce. Oryginał tego artykułu w języku angielskim znajduje się tutaj . 20 krótkich kroków do opanowania wyrażeń regularnych.  Część 3 - 1

Krok 11: Nawiasy ()jako grupy przechwytujące

20 krótkich kroków do opanowania wyrażeń regularnych.  Część 3 - 2W ostatnim zadaniu szukaliśmy różnych typów wartości całkowitych i zmiennoprzecinkowych (kropek). Jednak silnik wyrażeń regularnych nie rozróżnił tych dwóch typów wartości, ponieważ wszystko zostało ujęte w jednym dużym wyrażeniu regularnym. Możemy powiedzieć silnikowi wyrażeń regularnych, aby rozróżniał różne typy dopasowań, jeśli umieścimy nasze mini-wzorce w nawiasach:
wzór: ([AZ])|([az]) 
string:   Obecnym Prezydentem Boliwii jest Evo Morales .
mecze: ^^^ ^^^^^^^ ^^^^^^^^^ ^^ ^^^^^^^ ^^ ^^^ ^^^^^^^ 
grupa:    122 2222222 122222222 22 1222222 22 122 1222222  
( Przykład ) Powyższe wyrażenie regularne definiuje dwie grupy przechwytywania, które są indeksowane począwszy od 1. Pierwsza grupa przechwytywania dopasowuje dowolną pojedynczą wielką literę, a druga grupa przechwytywania dopasowuje dowolną pojedynczą małą literę. Używając znaku „lub” |i nawiasów ()jako grupy przechwytującej, możemy zdefiniować pojedyncze wyrażenie regularne, które pasuje do wielu rodzajów ciągów. Jeśli zastosujemy to do naszego wyrażenia regularnego wyszukiwania długiego/zmiennoprzecinkowego z poprzedniej części artykułu, silnik wyrażeń regularnych przechwyci odpowiednie dopasowania w odpowiednich grupach. Sprawdzając, do której grupy pasuje podciąg, możemy od razu określić, czy jest to wartość zmiennoprzecinkowa, czy długa:
wzór: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) 
ciąg:   42L 12 x 3,4f 6l 3,3 0F LF .2F 0.
mecze: ^^^ ^^^^ ^^ ^^ ^^^ 
grupa:    222 1111 22 11 111  
( Przykład ) To wyrażenie regularne jest dość złożone i aby je lepiej zrozumieć, rozbijmy je na części i przyjrzyjmy się każdemu z tych wzorców:
( // dopasowuje dowolny podciąg „float”.
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| // LUB
( // dopasowuje dowolny „długi” podciąg
  \d+[ll]
)
Grupy znaków |i przechwytywania w nawiasach ()pozwalają nam dopasowywać różne typy podciągów. W tym przypadku dopasowujemy albo liczby zmiennoprzecinkowe „float”, albo długie liczby całkowite „long”.
(
  \d*\.\d+[fF] // 1+ cyfra na prawo od przecinka dziesiętnego
  |
  \d+\.\d*[fF] // 1+ cyfra na lewo od przecinka dziesiętnego
  |
  \d+[fF] // bez kropki, tylko 1+ cyfra
)
|
(
  \d+[lL] // bez kropki, tylko 1+ cyfra
)
W grupie przechwytywania „zmiennoprzecinkowej” mamy trzy opcje: liczby z co najmniej 1 cyfrą po prawej stronie przecinka, liczby z co najmniej 1 cyfrą po lewej stronie przecinka i liczby bez przecinka. Każdy z nich jest „pływakiem”, o ile ma na końcu litery „f” lub „F”. Wewnątrz grupy przechwytywania „długiej” mamy tylko jedną opcję - musimy mieć 1 lub więcej cyfr, po których następuje znak „l” lub „L”. Silnik wyrażeń regularnych będzie szukać tych podciągów w danym ciągu i indeksować je w odpowiedniej grupie przechwytywania. notatkaże nie pasujemy do żadnej z liczb, do których nie dodano żadnego z „l”, „L”, „f” lub „F”. Jak należy klasyfikować te liczby? Cóż, jeśli mają kropkę dziesiętną, domyślnym językiem Java jest „podwójne”. W przeciwnym razie muszą to być „int”.

Skonsolidujmy to, czego się nauczyliśmy, za pomocą kilku łamigłówek:

Dodaj dwie kolejne grupy przechwytywania do powyższego wyrażenia regularnego, aby klasyfikowało również liczby podwójne lub int. (To kolejne trudne pytanie, nie zniechęcaj się, jeśli zajmie to trochę czasu, w ostateczności zobacz moje rozwiązanie.)
wzór:
ciąg:   42L 12 x 3,4f 6l 3,3 0F LF .2F 0. 
mecze: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^ 
grupa:    333 44 1111 33 222 11 111 22
( Rozwiązanie ) Następny problem jest trochę prostszy. Użyj grup przechwytywania w nawiasach (), znaku „lub” |i zakresów znaków, aby posortować następujące grupy wiekowe: „pić legalnie w USA”. (>= 21) i „w USA nie wolno pić” (<21):
wzór:
ciąg:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
dopasowań: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
grupa:    2 22 22 22 22 22 11 11 11 11 11 11 111 111 
( Rozwiązanie )

Krok 12: Najpierw zidentyfikuj bardziej szczegółowe dopasowania

20 krótkich kroków do opanowania wyrażeń regularnych.  Część 3 - 3Mogłeś mieć pewne problemy z ostatnim zadaniem, jeśli próbowałeś zdefiniować „legalnie pijących” jako pierwszą grupę przechwytującą, a nie drugą. Aby zrozumieć dlaczego, spójrzmy na inny przykład. Załóżmy, że chcemy osobno zapisać nazwiska zawierające mniej niż 4 znaki i nazwiska zawierające 4 i więcej znaków. Nadajmy krótsze nazwy pierwszej grupie przechwytującej i zobaczmy, co się stanie:
wzór: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
ciąg znaków:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
mecze: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
grupa:    111 111 11 111 111 111 111   
( Przykład ) Domyślnie większość silników wyrażeń regularnych używa zachłannego dopasowywania do podstawowych znaków, które widzieliśmy do tej pory. Oznacza to, że silnik wyrażeń regularnych przechwyci najdłuższą grupę zdefiniowaną możliwie najwcześniej w podanym wyrażeniu regularnym. Zatem chociaż druga grupa powyżej może przechwycić więcej znaków w nazwach, takich jak na przykład „Jobs” i „Cloyd”, ale ponieważ pierwsze trzy znaki tych nazw zostały już przechwycone przez pierwszą grupę przechwytującą, nie mogą zostać przechwycone ponownie przez drugą . Teraz wprowadźmy małą poprawkę - po prostu zmień kolejność grup przechwytywania, umieszczając najpierw bardziej szczegółową (dłuższą) grupę:
wzór: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
ciąg znaków:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
mecze: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
grupa:    222 1111 22 11111 1111 222 1111    
( Przykład )

Zadanie... tym razem tylko jedno :)

„Bardziej szczegółowy” wzór prawie zawsze oznacza „dłuższy”. Powiedzmy, że chcemy znaleźć dwa rodzaje „słów”: najpierw te, które zaczynają się od samogłosek (dokładniej), a następnie te, które nie zaczynają się od samogłosek (dowolne inne słowo). Spróbuj napisać wyrażenie regularne, aby przechwycić i zidentyfikować ciągi znaków pasujące do tych dwóch grup. (Poniższe grupy są oznaczone literami, a nie numerami. Musisz określić, która grupa powinna odpowiadać pierwszej, a która drugiej.)
wzór:
ciąg znaków:   pds6f uub 24r2gp ewqrty l ui_op 
dopasowania: ^^^^^ ^^^ ^^^^^^ ^^^^^^ ^ ^^^^^ 
grupa:    NNNNN VVV NNNNNN VVVVVV N VVVVV
( Rozwiązanie ) Ogólnie rzecz biorąc, im bardziej precyzyjne jest wyrażenie regularne, tym dłużej ono będzie trwało. Im dokładniejszy, tym mniejsze prawdopodobieństwo, że uchwycisz coś, czego nie potrzebujesz. Więc chociaż mogą wyglądać przerażająco, dłuższe wyrażenia regularne ~= lepsze wyrażenia regularne. Niestety .

Krok 13: Nawiasy klamrowe {}na określoną liczbę powtórzeń

20 krótkich kroków do opanowania wyrażeń regularnych.  Część 3 - 4W przykładzie z nazwiskami z poprzedniego kroku mieliśmy 2 prawie powtarzające się grupy w jednym schemacie:
wzór: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
ciąg znaków:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
mecze: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
grupa:    222 1111 22 11111 1111 222 1111    
W przypadku pierwszej grupy potrzebowaliśmy nazwisk składających się z czterech lub więcej liter. Druga grupa musiała uchwycić nazwiska składające się z trzech lub mniejszej liczby liter. Czy jest łatwiejszy sposób na napisanie tego niż [a-z]wielokrotne powtarzanie tych grup? Istnieje, jeśli użyjesz do tego nawiasów klamrowych {}. Nawiasy klamrowe {}pozwalają nam określić minimalną i (opcjonalnie) maksymalną liczbę dopasowań poprzedniego znaku lub grupy przechwytywania. Istnieją trzy przypadki użycia {}:
{X} // dopasowuje dokładnie X razy
{X,} // dopasowania >= X razy
{X,Y} // dopasowuje >= X i <= Y razy
Oto przykłady tych trzech różnych składni:
wzór: [az]{11} 
ciąg:   humuhumunuk unukuapua'a.
mecze: ^^^^^^^^^^^   
( Przykład )
wzór: [az]{18,} 
ciąg:   humuhumunukunukuapua 'a.
mecze: ^^^^^^^^^^^^^^^^^^^^^^    
( Przykład )
wzór: [az]{11,18} 
ciąg:   humuhumunukunukuap ua'a.
mecze: ^^^^^^^^^^^^^^^^^^^    
( Przykład ) W powyższych przykładach należy zwrócić uwagę na kilka kwestii.notatka:. Po pierwsze, stosując notację {X}, poprzedni znak lub grupa będzie pasować dokładnie tę liczbę (X) razy. Jeżeli w „słowie” (niż liczba X) jest więcej znaków, które mogłyby pasować do wzorca (jak pokazano w pierwszym przykładzie), to nie zostaną one uwzględnione w dopasowaniu. Jeśli liczba znaków jest mniejsza niż X, pełne dopasowanie nie powiedzie się (w pierwszym przykładzie spróbuj zmienić 11 na 99). Po drugie, oznaczenia {X,} i {X,Y} są zachłanne. Będą starali się dopasować jak najwięcej znaków, jednocześnie spełniając podane wyrażenie regularne. Jeśli określisz {3,7}, można dopasować od 3 do 7 znaków, a jeśli kolejnych 7 znaków jest prawidłowych, dopasowane zostaną wszystkie 7 znaków. Jeśli określisz {1,} i wszystkie następne 14 000 znaków będą zgodne, wówczas wszystkie 14 000 z tych znaków zostanie uwzględnionych w odpowiednim ciągu. Jak możemy wykorzystać tę wiedzę do przepisania powyższego wyrażenia? Najprostszym ulepszeniem może być zastąpienie sąsiednich grup [a-z]przez [a-z]{N}, gdzie odpowiednio wybiera się N:
wzór: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...ale to nie poprawia sytuacji. Spójrz na pierwszą grupę przechwytywania: mamy [a-z]{2}(która pasuje dokładnie do 2 małych liter), po której następuje [a-z]+(która pasuje do 1 lub więcej małych liter). Możemy to uprościć, prosząc o 3 lub więcej małych liter w nawiasach klamrowych:
wzór: ([AZ][az]{3,})|([AZ][az]?[az]?) 
Druga grupa przechwytywania jest inna. Potrzebujemy nie więcej niż trzech znaków w tych nazwiskach, co oznacza, że ​​​​mamy górną granicę, ale nasza dolna granica wynosi zero:
wzór: ([AZ][az]{3,})|([AZ][az]{0,2}) 
Konkretność jest zawsze lepsza, gdy używasz wyrażeń regularnych, więc mądrze byłoby na tym poprzestać, ale nie mogę nie zauważyć, że te dwa zakresy znaków ( [AZ]i [az]) obok siebie wyglądają prawie jak klasa „znak słowa”, \w( [A-Za-z0-9_]) . Gdybyśmy mieli pewność, że nasze dane zawierają tylko dobrze sformatowane nazwiska, moglibyśmy uprościć nasze wyrażenie regularne i napisać po prostu:
wzór: (\w{4,})|(\w{1,3}) 
Pierwsza grupa przechwytuje dowolną sekwencję 4 lub więcej „znaków słów” ( [A-Za-z0-9_]), a druga grupa przechwytuje dowolną sekwencję od 1 do 3 „znaków słów” (włącznie). Czy to zadziała?
wzór: (\w{4,})|(\w{1,3}) 
ciąg:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
mecze: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
grupa:    222 1111 22 11111 1111 222 1111    
( Przykład ) Udało się! A co powiecie na takie podejście? I jest znacznie czystszy niż w naszym poprzednim przykładzie. Ponieważ pierwsza grupa przechwytująca dopasowuje wszystkie nazwiska posiadające cztery lub więcej znaków, możemy nawet zmienić drugą grupę przechwytującą po prostu na \w+, ponieważ pozwoliłoby nam to przechwycić wszystkie pozostałe nazwiska (z 1, 2 lub 3 znakami):
wzór: (\w{4,})|(\w+) 
ciąg:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
mecze: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
grupa:    222 1111 22 11111 1111 222 1111    
( Przykład )

Pomóżmy mózgowi się tego nauczyć i rozwiązać następujące 2 problemy:

Użyj nawiasów klamrowych {}, aby przepisać wyrażenie regularne wyszukiwania numeru ubezpieczenia społecznego z kroku 7:
wzór:
ciąg: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
mecze:              ^^^^^^^^^^^
( Rozwiązanie ) Załóżmy, że narzędzie do sprawdzania siły haseł witryny internetowej wymaga, aby hasła użytkowników miały od 6 do 12 znaków. Napisz wyrażenie regularne oznaczające nieprawidłowe hasła na poniższej liście. Każde hasło jest zawarte w nawiasach, ()aby ułatwić dopasowanie, dlatego upewnij się, że wyrażenie regularne zaczyna się i kończy znakami dosłownymi (i )symbolicznymi. Wskazówka: upewnij się, że nie zezwalasz na dosłowne nawiasy w hasłach z [^()]lub podobnymi, w przeciwnym razie zakończy się dopasowaniem całego ciągu!
wzór:
string:   (12345) (moje hasło) (Xanadu.2112) (su_do) (OfSalesmen!)
mecze: ^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^  
( Rozwiązanie )

Krok 14: \bSymbol granicy o zerowej szerokości

20 krótkich kroków do opanowania wyrażeń regularnych.  Część 3 - 5Ostatnie zadanie było dość trudne. Ale co by było, gdybyśmy nieco bardziej skomplikowali sprawę, umieszczając hasła w cudzysłowie ""zamiast w nawiasach ()? Czy możemy napisać podobne rozwiązanie, po prostu zastępując wszystkie znaki nawiasów znakami cudzysłowu?
wzór: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
string:   "12345" "moje hasło" "Xanadu.2112 " " su_do" " OfSprzedawcy! "
mecze: ^^^^^^^ ^^^^^^^^^^^^^ ^^^ ^^^  
( Przykład ) Nie wyszło to zbyt imponująco. Czy domyślacie się już dlaczego? Problem w tym, że szukamy tutaj błędnych haseł. „Xanadu.2112” to dobre hasło, więc gdy wyrażenie regularne zorientuje się, że ta sekwencja nie zawiera spacji ani znaków dosłownych ", ustępuje tuż przed znakiem "kwalifikującym hasło po prawej stronie. (Ponieważ określiliśmy, że znaków "nie można znaleźć w hasłach za pomocą [^"].) Gdy silnik wyrażeń regularnych uzna, że ​​te znaki nie pasują do określonego wyrażenia regularnego, uruchamia się ponownie dokładnie tam, gdzie został przerwany – tam, gdzie znajdował się znak ". co ogranicza „ Xanadu.2112” po prawej stronie. Stamtąd widzi jedną spację i drugą "- dla niego jest to błędne hasło! Zasadniczo znajduje tę sekwencję " "i idzie dalej. To wcale nie jest to, co chcielibyśmy uzyskać... Byłoby wspaniale, gdybyśmy mogli określić, że pierwszym znakiem hasła nie powinna być spacja. Czy jest na to sposób? (Prawdopodobnie już zdałeś sobie sprawę, że odpowiedź na wszystkie moje pytania retoryczne brzmi „tak”). Tak! Jest taki sposób! Wiele silników wyrażeń regularnych zapewnia sekwencję ucieczki, taką jak „granica słowa” \b. „Granica słowa” \bto sekwencja ucieczki o zerowej szerokości, która, co dziwne, pasuje do granicy słowa. Pamiętaj, że kiedy mówimy „słowo”, mamy na myśli dowolny ciąg znaków w klasie \wlub [A-Za-z0-9_]. Dopasowanie granicy słowa oznacza, że ​​znak bezpośrednio przed lub bezpośrednio po sekwencji \bmusi być неznakiem słowa. Jednak podczas dopasowywania nie uwzględniamy tego znaku w przechwyconym podciągu. To jest szerokość zerowa. Aby zobaczyć jak to działa, spójrzmy na mały przykład:
wzór: \b[^ ]+\b 
string:   Wciąż nie mamy pieniędzy , Lebowski .
mecze: ^^ ^^^^^ ^^^^ ^^ ^^^^^ ^^^^^^^^  
( Przykład ) Sekwencja [^ ]musi pasować do dowolnego znaku, który nie jest dosłownym znakiem spacji. Dlaczego więc nie odpowiada to przecinkowi ,po pieniądzu lub kropce „ .po Lebowskim? Dzieje się tak dlatego, że przecinek ,i kropka .nie są znakami słownymi, dlatego tworzone są granice pomiędzy znakami słownymi i znakami niebędącymi wyrazami. Pojawiają się one pomiędzy ykońcem słowo pieniądze i ,następujący po nim przecinek oraz pomiędzy " isłowem Lebowski i kropką .(kropką) po nim. Wyrażenie regularne dopasowuje granice tych słów (ale nie znaki niebędące wyrazami, które jedynie pomagają je zdefiniować). Ale co się stanie, jeśli nie uwzględnimy spójności \bw naszym szablonie?
wzór: [^ ]+ 
string:   Nadal nie mamy pieniędzy, Lebowski. 
mecze: ^^ ^^^^^ ^^^^ ^^ ^^^^^^ ^^^^^^^^^^  
( Przykład ) Tak, teraz znajdziemy też te znaki interpunkcyjne. Teraz użyjmy granic słów, aby naprawić wyrażenie regularne dla cytowanych haseł:
wzór: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" 
string:   "12345" "moje hasło" " Xanadu. 2112" "su_do" "Sprzedawcy!"
mecze: ^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^  
( Przykład ) Umieszczając granice słów w cudzysłowie („\b ... \b”), w rzeczywistości mówimy, że pierwszy i ostatni znak pasującego hasła muszą być „znakami wyrazów”. Działa to więc dobrze tutaj, ale nie będzie działać dobrze, jeśli pierwszy lub ostatni znak hasła użytkownika nie jest znakiem słownym:
wzór: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\"
ciąg znaków: „następujące hasłoistooshort” „C++”
mecze:   
( Przykład ) Zobacz, jak drugie hasło nie jest oznaczone jako „nieprawidłowe”, mimo że jest wyraźnie za krótkie. musisz byćostrożnyz sekwencjami \b, ponieważ dopasowują one tylko granice między znakami, \wa nie \w. W powyższym przykładzie, ponieważ w hasłach dopuściliśmy znaki not \w, nie ma gwarancji, że granica pomiędzy \pierwszym/ostatnim znakiem hasła będzie granicą słowa \b.

Aby ukończyć ten krok, rozwiążemy tylko jeden prosty problem:

Granice słów są przydatne w silnikach podświetlania składni, gdy chcemy dopasować określoną sekwencję znaków, ale chcemy mieć pewność, że występują one tylko na początku lub na końcu słowa (lub osobno). Załóżmy, że piszemy o podświetlaniu składni i chcemy wyróżnić słowo var, ale tylko wtedy, gdy pojawia się ono samodzielnie (bez dotykania innych znaków w słowie). Czy możesz napisać na to wyrażenie regularne? Oczywiście, że można, to bardzo proste zadanie ;)
wzór:
ciąg znaków:   var varx _var ( var j) barvarcar * var var -> { var }
mecze: ^^^ ^^^ ^^^ ^^^ ^^^  
( Rozwiązanie )

Krok 15: „daszek” ^jako „początek linii” i znak dolara $jako „koniec linii”

20 krótkich kroków do opanowania wyrażeń regularnych.  Część 3 - 6Sekwencja granic słów \b(z ostatniego kroku poprzedniej części artykułu) nie jest jedyną specjalną sekwencją o zerowej szerokości, którą można zastosować w wyrażeniach regularnych. Dwa najpopularniejsze to „daszek” ^– „początek linii” i znak dolara $– „koniec linii”. Dołączenie jednego z nich do wyrażeń regularnych oznacza, że ​​dopasowanie musi pojawić się na początku lub na końcu ciągu źródłowego:
wzór: ^start|end$ 
ciąg znaków:   początek koniec początek koniec początek koniec początek koniec 
dopasowania: ^^^^^ ^^^  
( Przykład ) Jeśli ciąg znaków zawiera podziały wierszy, ^startbędzie pasował do sekwencji „start” na początku dowolnej linii i end$będzie pasował do sekwencji „end” na końcu dowolnej linii (choć trudno to tutaj pokazać). Symbole te są szczególnie przydatne podczas pracy z danymi zawierającymi ograniczniki. Wróćmy do problemu „rozmiaru pliku” z kroku 9, używając ^„początku linii”. W tym przykładzie rozmiary naszych plików są oddzielone spacjami „ ”. Dlatego chcemy, aby każdy rozmiar pliku zaczynał się od liczby, poprzedzonej spacją lub początkiem linii:
wzór: (^| )(\d+|\d+\.\d+)[KMGT]B 
ciąg:   6,6KB 1..3KB 12KB 5G 3,3MB KB .6.2TB 9MB .
mecze: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
grupa:    222 122 1222 12    
( Przykład ) Jesteśmy już tak blisko celu! Ale możesz zauważyć, że nadal mamy jeden mały problem: dopasowujemy znak spacji przed prawidłowym rozmiarem pliku. Teraz możemy po prostu zignorować tę grupę przechwytującą (1), gdy znajdzie ją nasz silnik wyrażeń regularnych, lub możemy użyć grupy nieprzechwytującej, co zobaczymy w następnym kroku.

W międzyczasie rozwiążmy jeszcze 2 problemy dotyczące tonu:

Kontynuując nasz przykład podświetlania składni z ostatniego kroku, niektóre podświetlenia składni oznaczą spacje końcowe, to znaczy wszelkie spacje znajdujące się pomiędzy znakiem innym niż biały znak a końcem linii. Czy możesz napisać wyrażenie regularne, aby wyróżniać tylko spacje końcowe?
wzór:
ciąg znaków: myvec <- c(1, 2, 3, 4, 5)  
mecze:                          ^^^^^^^  
( Rozwiązanie ) Prosty parser wartości rozdzielanych przecinkami (CSV) będzie wyszukiwał „tokeny” oddzielone przecinkami. Ogólnie rzecz biorąc, spacja nie ma znaczenia, jeśli nie jest ujęta w cudzysłów "". Napisz proste wyrażenie regularne analizujące plik CSV, które dopasowuje tokeny zawarte w przecinkach, ale ignoruje (nie przechwytuje) białych znaków, które nie znajdują się w cudzysłowie.
wzór:
ciąg znaków:   a, "b", "c d",e,f, "g h", dfgi,, k, "", l 
odpowiada: ^^ ^^^^ ^^^^^^^^^^ ^^^ ^^^ ^^^^^^^ ^^ ^^^ ^ 
grupa:    21 2221 2222212121 222221 222211 21 221 2    
( Rozwiązanie ) RegEx: 20 krótkich kroków do opanowania wyrażeń regularnych. Część 4.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION