2016-08-19 25 views
9

W książce Eloquent JavaScriptchapter 9: Regular Expressions w sekcji „analizowania pliku INI” jest przykładem, który zawiera wyrażenie regularne nie złapać w ogóle. Autor stara się zanalizować następny zawartość:Jaka jest różnica między tymi dwoma wyrażeń regularnych? (Zrozumienie? Kwantyfikatorów)

searchengine=http://www.google.com/search?q=$1 
spitefulness=9.7 

; comments are preceded by a semicolon... 
; each section concerns an individual enemy 
[larry] 
fullname=Larry Doe 
type=kindergarten bully 
website=http://www.geocities.com/CapeCanaveral/11451 

[gargamel] 
fullname=Gargamel 
type=evil sorcerer 
outputdir=/home/marijn/enemies/gargamel 

sprawie zasad tego stanu formatu że

Puste linie i linie zaczynające się średnikiem są ignorowane.

Kod parsujący tę zawartość przewyższa każdy wiersz w pliku. W celu rozpatrzenia uwag, że to wyrażenie

^\s*(;.*)? 

O ile mi zrozumieć, linie proces ten wyraz, który może rozpocząć z sekwencją

białych znaków, w tym miejsca, zakładki, formy , podawanie linii i inne przestrzenie Unicode

(source), aż pojawi się średnik ;, a następnie sekwencję "dowolny pojedynczy znak z wyjątkiem terminatorów linii: \ n, \ r, \ u2028 lub". Wszystko to ograniczone do {0,1} wyglądy.

Nie rozumiem punktu kwantyfikatora ? tutaj. Nie jestem w stanie znaleźć (regex101) żadnego przypadku, w którym nie ograniczanie wyrażeń pasującego ciągu może być problemem. Dlaczego to wyrażenie różni się od tego drugiego:

^\s*(;.*) 

Z góry dziękuję.

Odpowiedz

6

Wymaga ^\s*(;.*) wymaga , nie może dopasować pustej linii.

^\s*(;.*)? może dopasować pustą linię, nie wymaga ;.

Część wspólna to ^\s* - początek linii (lub łańcucha), a następnie zero lub więcej białych znaków.

Następnie 1) (;.*) odpowiada ; (1 Nr obligatoryjnie), a następnie zero lub więcej znaki inne niż linią, i 2) (;.*)? dopasowuje opcjonalnie sekwencję (The (...)? oznacza ewentualnie istniejącą grupę od ? jest kwantyfikatorem dopasowanie jedno lub zero wystąpień ilościowego atomu, podczas gdy atom może być symbolem, klasą znaków, grupa) z ;, po której następują znaki 0+ inne niż nowa linia.

również zauważyć, że \s odpowiada jednemu z symboli LF i CR, a to oznacza, że ​​(w przypadku modyfikatora MULTILINE jest włączony, a wejście jest tekst zawiera wiele linii) regex ^\s* mogą być różne w kilku liniach do pierwszego bez odstępu postać.

+0

Tekst na połączonej stronie mówi, że dane wejściowe są najpierw dzielone na wiersze, więc tryb multilinii nie jest używany i nie ma żadnych znaków nowej linii dla '\ s *'. (To przyciągnęło moją uwagę.) –

+0

Dobrze, zmieniłem odpowiedź na * (jeśli modyfikator MULTILINE jest WŁĄCZONY, a dane wejściowe są tekstem zawierającym wiele linii) *. Jest to ogólna uwaga dla przyszłych czytelników. –

+1

Dzięki. Tęskniłem, wyrażenie musiało pasować również do pustych linii. Dzięki, że odpowiadasz tak szybko. –

2

Twoje zmodyfikowane końcowe wyrażenie wymaga średnika. Oryginalne wyrażenie regularne dopasuje linie, które są tylko białymi znakami.

Ponieważ intencją (jeśli dobrze rozumiem) jest zignorowanie linii dopasowanych przez to wyrażenie (jak - rzekomo - linie komentarza), sensowne jest również ignorowanie pustych linii.

+0

Dzięki. Twój komentarz wzmacnia moje zrozumienie! –