2010-10-08 25 views
5

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 ??

+5

Zaczynając od najbardziej oczywistego: perlre (http://perldoc.perl.org/perlre.html). – musiKk

+0

@msw i jedną z nich jest [ta strona tutaj] (http://stackoverflow.com/questions/3890739/what-does-mean-in-this-perl-regex?rq=1). – rightfold

Odpowiedz

25

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:

  1. ? 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

  2. 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ć)

  3. ? 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.

+0

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). –

+0

@Daniel: Dzięki. Myślę, że wyczyszczę # 3 i dodam listę z kilkoma linkami, aby inni ludzie mogli dalej do niej dodawać. – eldarerathis

+0

Dla jasności '(? Im)' włącza dwa tryby (bez względu na wielkość liter i multilinię);) –

2

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

7

$ perldoc perlreref:

(?:...) 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 
----------------------------------------------------------------------
2

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.