Regular Expressions
Якорные персонажи: Карет (^)
Поиск…
замечания
терминология
Характер Caret (^) также обозначается следующими терминами:
- шапка
- контроль
- стрелка вверх
- шеврон
- округлый акцент
использование
Он имеет два применения в регулярных выражениях:
- Чтобы обозначить начало строки
- Если он используется сразу после квадратной скобки (
[^
), он действует, чтобы свести на нет множество допустимых символов (т. Е.[123]
означает, что символ 1, 2 или 3 разрешен, а оператор[^123]
означает любой символ, отличный от 1 , 2 или 3.
Сбой символа
Чтобы выразить каретку без особого значения, ее следует избегать, предшествуя ей обратным слэшем; т. е. \^
.
Начало линии
Когда многострочный (?m)
модификатор выключен , ^
соответствует только началу входной строки:
Для регулярного выражения
^He
Следующие строки ввода соответствуют:
-
Hedgehog\nFirst line\nLast line
-
Help me, please
-
He
И следующие строки ввода не совпадают:
-
First line\nHedgehog\nLast line
-
IHedgehog
-
Hedgehog
(из-за белых пространств)
Когда многострочный (?m)
модификатор включен, ^
совпадает с началом каждой линии в:
^He
Вышеупомянутое будет соответствовать любой входной строке, содержащей строку, начинающуюся с He
.
Учитывая \n
как новый символ линии, следующие строки соответствуют:
-
Hello
-
First line\nHedgehog\nLast line
(только вторая строка) -
My\nText\nIs\nHere
(только последняя строка)
И следующие строки ввода не совпадают:
-
Camden Hells Brewery
-
Helmet
(из-за белых пространств)
Соответствие пустых строк с помощью ^
Другим типичным вариантом использования для каретки является сопоставление пустых строк (или пустая строка, если многострочный модификатор выключен).
Чтобы соответствовать пустой строке (multi-line on ), каретка используется рядом с $
который является другим символом привязки, представляющим позицию в конце строки ( Anchor Characters: Dollar ($) ). Поэтому следующее регулярное выражение будет соответствовать пустой строке:
^$
Избегание символа каретки
Если вам нужно использовать символ ^
в символьном классе ( классы символов ), поставьте его где-то иначе, чем начало класса:
[12^3]
Или избегайте ^
используя обратную косую черту \
:
[\^123]
Если вы хотите совместить символ каретки вне класса персонажа, вам нужно сбежать от него:
\^
Это предотвращает интерпретацию ^
как якорный символ, представляющий начало строки / строки.
Сравнение начала линейного якоря и начала привязки строки
Хотя многие считают, что ^
означает начало строки, это на самом деле означает начало строки. Для фактического начала использования привязки строк, \A
Строка hello\nworld
(или более ясно)
hello
world
Соответствовали бы регулярным выражениям ^h
, ^w
и \Ah
но не \Aw
Многострочный модификатор
По умолчанию каретки ^
метасимвол соответствует положению перед первым символом в строке.
Учитывая, что строка « charsequence » применяется к следующим шаблонам: /^char/
& /^sequence/
, движок будет пытаться соответствовать следующим образом:
/^char/
- ^ -
CharSequence
- c -
c
harsequence - h -
ch
arsequence - a -
cha
rsequence - r - последовательность
char
Найдено совпадение
- ^ -
/^sequence/
- ^ -
CharSequence
- s -
CharSequence
Матч не найден
- ^ -
Такое же поведение будет применено, даже если строка содержит ограничители строк , такие как \r?\n
Будет соответствовать только позиция в начале строки.
Например:
/^/g
┊char \ г \ п
\ Г \ п
последовательность
Однако, если вам нужно сопоставлять после каждого терминатора линии, вам нужно будет установить многострочный режим ( //m
, (?m)
) внутри вашего шаблона. Поступая таким образом, каретка ^
будет соответствовать «начало каждой строки», что соответствует положению в начале строки и позиции сразу же после того, как 1 линия терминаторов.
1 В некоторых вариантах (Java, PCRE, ...), ^
не будет совпадать после терминатора строк, если терминатор линии является последним в строке.
Например:
/^/gm
┊char \ г \ п
┊ \ г \ п
┊sequence
Некоторые из двигателей регулярных выражений, которые поддерживают модификатор 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 и 3 (встроенный модуль
re
)abc_regex = re.compile("(?m)^abc"); abc_regex = re.compile("^abc", re.MULTILINE);