Regular Expressions
Znaki kotwicy: Caret (^)
Szukaj…
Uwagi
Terminologia
Do znaku Caret (^) odnoszą się również następujące terminy:
- kapelusz
- kontrola
- strzałka w górę
- szewron
- akcent okrężny
Stosowanie
Ma dwa zastosowania w wyrażeniach regularnych:
- Aby oznaczyć początek linii
- Jeśli zostanie użyty natychmiast po nawiasie kwadratowym (
[^
), działa to tak, aby negować zestaw dozwolonych znaków (tj.[123]
oznacza, że znak 1, 2 lub 3 jest dozwolony, a wyrażenie[^123]
oznacza dowolny znak inny niż 1 , 2 lub 3 jest dozwolone.
Ucieczka postaci
Aby wyrazić daszek bez specjalnego znaczenia, należy uciec, poprzedzając go odwrotnym ukośnikiem; tj. \^
.
Początek linii
Gdy modyfikator wielowierszowy (?m)
jest wyłączony , ^
dopasowuje tylko początek ciągu wejściowego:
Dla wyrażenia regularnego
^He
Pasują następujące ciągi wejściowe:
-
Hedgehog\nFirst line\nLast line
-
Help me, please
-
He
I następujące ciągi wejściowe nie pasują:
-
First line\nHedgehog\nLast line
-
IHedgehog
-
Hedgehog
(z powodu białych znaków)
Kiedy multi-line (?m)
modyfikator jest włączona, ^
dopasowuje początek każdej linii jest:
^He
Powyższe pasowałoby do dowolnego ciągu wejściowego zawierającego linię rozpoczynającą się od He
.
Biorąc pod uwagę \n
jako nowy znak wiersza, pasują następujące wiersze:
-
Hello
-
First line\nHedgehog\nLast line
(tylko druga linia) -
My\nText\nIs\nHere
(tylko ostatni wiersz)
I następujące ciągi wejściowe nie pasują:
-
Camden Hells Brewery
-
Helmet
(z powodu białych znaków)
Dopasowywanie pustych linii za pomocą ^
Innym typowym przypadkiem użycia karetki jest dopasowanie pustych linii (lub pustego łańcucha, jeśli modyfikator wieloliniowy jest wyłączony).
Aby dopasować pustą linię (multi-line on ), obok $
jest używany znak karetki, który jest innym znakiem kotwicy reprezentującym pozycję na końcu linii ( Znaki kotwicy: Dolar ($) ). Dlatego następujące wyrażenie regularne będzie pasować do pustej linii:
^$
Ucieczka od znaku karetki
Jeśli chcesz użyć znaku ^
w klasie znaków (klasy postaci ), umieść go w innym miejscu niż początek klasy:
[12^3]
Lub ucieknij ^
używając ukośnika \
:
[\^123]
Jeśli chcesz dopasować samą postać karetki poza klasą postaci, musisz uciec od niej:
\^
Zapobiega to interpretacji ^
jako znaku kotwicy reprezentującego początek łańcucha / linii.
Porównanie początku kotwicy liniowej i początku kotwicy sznurkowej
Podczas gdy wiele osób uważa, że ^
oznacza początek łańcucha, tak naprawdę oznacza początek linii. Aby uzyskać rzeczywisty początek użycia kotwicy łańcuchowej, \A
Łańcuch hello\nworld
(lub bardziej wyraźnie)
hello
world
Pasują do nich wyrażenia regularne ^h
, ^w
\Ah
ale nie przez \Aw
Modyfikator wielowierszowy
Domyślnie metaznak daszka ^
dopasowuje pozycję przed pierwszym znakiem w ciągu.
Biorąc pod uwagę ciąg „ charsequence ” zastosowany wobec następujących wzorców: /^char/
& /^sequence/
, silnik będzie próbował dopasować w następujący sposób:
/^char/
- ^ -
charytatywność
- c -
c
konsekwencja - h -
ch
konsekwencja - a -
cha
konsekwencja - r - sekwencja
char
Znaleziono dopasowanie
- ^ -
/^sequence/
- ^ -
charytatywność
- s -
charytatywność
Nie znaleziono dopasowania
- ^ -
To samo zachowanie zostanie zastosowane, nawet jeśli ciąg znaków zawiera terminatory linii , takie jak \r?\n
Dopasowana zostanie tylko pozycja na początku łańcucha.
Na przykład:
/^/g
\Char \ r \ n
\ r \ n
sekwencja
Jeśli jednak musisz dopasowywać po każdym zakończeniu linii, będziesz musiał ustawić tryb multilinii ( //m
, (?m)
) w swoim wzorcu. W ten sposób kursor ^
dopasuje „początek każdej linii”, co odpowiada pozycji na początku łańcucha i pozycjom bezpośrednio po 1 zakończeniu linii.
1 W niektórych odmianach (Java, PCRE, ...) ^
nie będzie pasować za terminatorem linii, jeśli terminator linii jest ostatnim w ciągu.
Na przykład:
/^/gm
\Char \ r \ n
┊ \ r \ n
┊sekwencja
Niektóre z silników wyrażeń regularnych, które obsługują modyfikator Multiline:
Pattern pattern = Pattern.compile("(?m)^abc"); Pattern pattern = Pattern.compile("^abc", Pattern.MULTILINE);
var abcRegex = new Regex("(?m)^abc"); var abdRegex = new Regex("^abc", RegexOptions.Multiline)
/(?m)^abc/ /^abc/m
Python 2 i 3 (wbudowany moduł
re
)abc_regex = re.compile("(?m)^abc"); abc_regex = re.compile("^abc", re.MULTILINE);