Mam wyrażeń regularnych Perl. Ale nie jestem pewien, co "?" oznacza w tym kontekście.Co oznacza `?` W tym wyrażeniu Perla?
m#(?:\w+)#
Co znaczy ?
?
Mam wyrażeń regularnych Perl. Ale nie jestem pewien, co "?" oznacza w tym kontekście.Co oznacza `?` W tym wyrażeniu Perla?
m#(?:\w+)#
Co znaczy ?
?
W tym przypadku ?
jest aktualnie używany w połączeniu z :
. Ułóż razem, ?:
na początku grupowania, aby grupować, ale nie przechwytywać tekstu/wzorca w nawiasach (jak w, nie będzie on przechowywany w żadnych odwołaniach zwrotnych, takich jak \1
lub $1
, więc nie będziesz mieć dostępu do zgrupowanych tekst bezpośrednio).
Dokładniej, ?
trzy różne znaczenia w regex:
?
kwantyfikator oznacza „zero lub jeden powtórzeń” wyrażenia. Jednym z kanonicznych przykładów widziałem to s?he
który będzie pasował zarówno she
i he
od ?
sprawia, że „opcja” s
Kiedy kwantyfikator (+
, *
, ?
lub ogólnie {n,m}
) następuje ?
następnie jest mecz nie chciwy (czyli będzie to pasować do najkrótszej ciąg począwszy od tej pozycji, która umożliwia dopasowanie postępować)
?
na początku nawiasy grupy oznacza, że chcesz wykonać specjalny akcja. Podobnie jak w tym przypadku, :
oznacza grupowanie, ale nie przechwytywanie. Dokładna lista działań dostępny będzie się nieco różnić od jednego silnika regex do drugiego, ale tutaj jest lista (niekoniecznie all-inclusive) niektóre z nich:
A. Non-capturing group: (?:text)
B. Lookaround: (?=a)
dla uprzedzający, ?!
dla negatywnego wyprzedzenia lub ?<=
i ?<!
dla lookbehinds (odpowiednio pozytywny i negatywny).
C. Conditional Matches: (?(condition)then|else)
.
D. Atomic Grouping: a(?>bc|b)c
(zgodne abcc
ale nieabc
patrz odnośnik)
E. Inline enabling/disabling of regex matching modifiers: ?i
aby umożliwić tryb, ?-i
wyłączyć. Możesz również włączyć/wyłączyć więcej niż jeden modyfikator naraz, łącząc je, np. ?im
(i
nie uwzględnia wielkości liter, a m
jest wielowierszowe).
F. Named capture groups: (?P<name>pattern)
, do której można się później odwołać, używając (?P=name)
. Mechanizm regex .NET używa zamiast tego składni (?<name>pattern)
.
G. Comments: (?#Comment text)
. Osobiście uważam, że to po prostu dodaje bałaganu, ale myślę, że mogłoby to służyć niektórym ... free-spacing mode może być lepszą opcją (modyfikator (?x)
).
Zasadniczo cel ?
jest tylko kontekstowy.Jeśli chcesz uzyskać zero lub więcej powtórzeń literalnej postaci, musisz użyć \(?
, aby uciec przed parenami.
Dla punktu # 3, istnieje również ((?> ...) ', który jest [grupą atomową] (http://www.regular-expressions.info/atomic.html) w smakach, które ją obsługują, oraz' ' (? i) 'i' (? -i) 'dla wstawiania włączania/wyłączania [modyfikatorów] (http://www.regular-expressions.info/modifiers.html). –
@Daniel: Dzięki. Myślę, że wyczyszczę # 3 i dodam listę z kilkoma linkami, aby inni ludzie mogli dalej do niej dodawać. – eldarerathis
Dla jasności '(? Im)' włącza dwa tryby (bez względu na wielkość liter i multilinię);) –
To nie są przechwytujące nawiasy. Są używane do grupowania (tak jak normalne nawiasy), ale grupa nie zostanie dodana do tablicy przechwytywania (tzn. Nie będzie można jej użyć w \ n).
Zobacz tutaj: http://www.regular-expressions.info/refadv.html
Zobacz regex tutorial, który jest zainstalowany w każdej wersji Perl (w szczególności this section).
(?:...)
Grupy Podwyrażenia bez przechwytywania (klaster)
You can also useYAPE::Regex::Explain:
C:\\Temp> perl -MYAPE::Regex::Explain -e \ "print YAPE::Regex::Explain->new(qr#(?:\w+)#)->explain" The regular expression: (?-imsx:(?:\w+)) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with^and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- (?: group, but do not capture: ---------------------------------------------------------------------- \w+ word characters (a-z, A-Z, 0-9, _) (1 or more times (matching the most amount possible)) ---------------------------------------------------------------------- ) end of grouping ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------
Krótko mówiąc, sekwencja (?
rozpoczyna wyrażenie regularne specjalną funkcję. Rzeczy następujące po (?
określają specjalną cechę, w tym przypadku grupę nie przechwytującą. Obejmujemy to zarówno w Intermediate Perl i Effective Perl Programming. Dokumenty regularne Perl w formacie perlre.
Zaczynając od najbardziej oczywistego: perlre (http://perldoc.perl.org/perlre.html). – musiKk
@msw i jedną z nich jest [ta strona tutaj] (http://stackoverflow.com/questions/3890739/what-does-mean-in-this-perl-regex?rq=1). – rightfold