I prawie miałeś rację z tym, że ^
to pierwszy znak, choć niezupełnie.
Jeśli ^
znajdzie się na początku definicji zakresu znaków, czyli na początku treści nawiasów kwadratowych []
, to ^
oznacza negację tego zakresu. Czyli jeśli normalny zakres [A-Z]
oznacza litery od A do Z, to zakres z negacją: [^A-Z]
oznacza "dowolne znaki, które NIE są literami od A do Z`.
Jeśli ^
jest użyte w innym miejscu, to oznacza prawie to, co myślałeś, czyli jakby "pierwszy znak".
Ale niezupełnie. Tak naprawdę oznacza nie znak, tylko pozycję przed pierwszym znakiem. Jeśli chcesz dopasować ciągi, które zaczynają się od litery A, po czym następuje jedna lub więcej cyfr, możesz użyć takiego wzorca: ^A[0-9]+
(lub krócej: ^A\d+
). Fakt, że ^
nie dopasowuje tak naprawdę pierwszej litery, tylko pozycję przed pierwszą literą, ma spore znaczenie. Zauważ, że jeśli dopasowywana byłaby litera, to ciąg A123 nie pasowałby do poprzedniego wzorca, mimo że powinien. Bo daszek zostałby dopasowany do pierwszego znaku, czyli litery A, a następnie w wyrażeniu regularnym mamy po prostu A, które byłoby dopasowane do kolejnego znaku: kolejnym znakiem jest jednak cyfra 1. "A" z wyrażenia nie pasuje do "1" z ciągu i wyrażenie nie działa.
Dobrze więc, że tak nie jest i że ^
dopasowuje tylko pozycję przed pierwszym znakiem, a nie sam pierwszy znak. ^
nie zżera nam znaku. Sam fakt, że sprawdzając jakiś ciąg znajdujemy się na jego początku satysfakcjonuje ^
i do pierwszego znaku dopasowywany jest kolejny element naszego wyrażenia. W naszym przykładzie, "A" z wyrażenia dopasowywane jest do pierwszego znaku, którym jest "A" -- więc pasuje! -- a do kolejnego fragmentu wyrażenia, czyli [0-9]+
dopasowywane są kolejne znaki, czyli "123". I znowu: wszystko pasuje, ciąg dopasowany.