Я - любитель в JavaScript. Я видел это другой (теперь удаленный) вопрос, и он заставил меня задаться вопросом. Можно ли сказать мне, что делает ниже регулярного выражения, точно означают?
split(/\|(?=\w=>)/)
Это разделяет строку с |
?
Он разделяет строку на |
, но только если за ней следует символ в [a-zA-Z0-9_]
и =>
Пример:
Он разделит a|b=>
на |
Он не разделит a|b
на |
Разделяет строку на каждое '|', за которым следует (?) буквенно-цифровой символ (\w, сокращение для [a-zA-Z0-9_]) + последовательность символов '=>'.
Вот ссылка, которая может помочь вам понять регулярные выражения в javascript
Регулярное выражение содержится в слешах. Это означает
\| # A pipe symbol. It needs to be scaped with a backslash
# because otherwise it means "OR"
(?= # a so-called lookahead group. It checks if its contents match
# at the current position without actually advancing in the string
\w=> # a word character (a-z, A-Z, 0-9, _) followed by =>
) # end of lookahead group.
Разбивка регулярного выражения:
/
литеральный разделитель начала регулярного выражения\|
совпадение |
в строке, |
- специальный символ в regex, поэтому \
используется для его экранирования(? =
- это выражение вперед, оно проверяет, следует ли строка за выражением, не совпадая с ним\w=>
соответствует любой буквенно-цифровой строке (включая _
), за которым следует =>
)/
отмечает конец выражения lookahead и конец regexКороче говоря, строка будет разбита на |
, если за ней следует любой буквенно-цифровой символ или знак подчеркивания, а затем =>
.
В этом случае вертикальная черта экранируется, поэтому она рассматривается как буквальная вертикальная черта. Разделение происходит по каналам, за которыми следуют любые буквенно-цифровые символы и '=>'.
Символ '|' также используется в регулярных выражениях как своего рода оператор ИЛИ. Например:
split(/k|i|tt|y/)
Разделится на символ «k», «i», «tt» или «y».
Обрезав разделительные символы, мы получаем \|(?=\w=>)
|
- это специальный символ в regex, поэтому его следует экранировать обратной косой чертой, как \|
(? =REGEX)
- это синтаксис для положительного просмотра: совпадает только если совпадает REGEX
, но не поглощает подстроку, которая совпадает с REGEX
. Совпадение с REGEX
не становится частью совпадающего результата. Если бы это было просто \|\w=>
, родительская строка была бы разбита вокруг |a=>
вместо |
. Таким образом, /\|(?=\w=>)/
соответствует только тем |
символам, за которыми следует \w=>
. Он соответствует |a=>
, но не |a>
, ||
и т.д.
Рассмотрим пример строки из связанного вопроса: a=>aa|b=>b||b|c=>cc
. Если бы не lookahead, split даст массив [a=>aa, b||b, cc]
. При использовании lookahead вы получите [a=>aa, b=>b||b, c=>cc]
, что и является желаемым результатом.