Что делает регулярное выражение \| (? = \w =>) средний?

Я - любитель в JavaScript. Я видел это другой (теперь удаленный) вопрос, и он заставил меня задаться вопросом. Можно ли сказать мне, что делает ниже регулярного выражения, точно означают?

split(/\|(?=\w=>)/)

Это разделяет строку с |?

5
задан Community 23 May 2017 в 11:55
поделиться

6 ответов

Он разделяет строку на |, но только если за ней следует символ в [a-zA-Z0-9_] и =>

Пример:

Он разделит a|b=> на |

Он не разделит a|b на |

4
ответ дан 18 December 2019 в 13:12
поделиться

Разделяет строку на каждое '|', за которым следует (?) буквенно-цифровой символ (\w, сокращение для [a-zA-Z0-9_]) + последовательность символов '=>'.

Вот ссылка, которая может помочь вам понять регулярные выражения в javascript

2
ответ дан 18 December 2019 в 13:12
поделиться

Регулярное выражение содержится в слешах. Это означает

\|        # 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.
7
ответ дан 18 December 2019 в 13:12
поделиться

Разбивка регулярного выражения:

  • / литеральный разделитель начала регулярного выражения
  • \| совпадение | в строке, | - специальный символ в regex, поэтому \ используется для его экранирования
  • (? = - это выражение вперед, оно проверяет, следует ли строка за выражением, не совпадая с ним
  • \w=> соответствует любой буквенно-цифровой строке (включая _), за которым следует =>
  • )/ отмечает конец выражения lookahead и конец regex

Короче говоря, строка будет разбита на |, если за ней следует любой буквенно-цифровой символ или знак подчеркивания, а затем =>.

1
ответ дан 18 December 2019 в 13:12
поделиться

В этом случае вертикальная черта экранируется, поэтому она рассматривается как буквальная вертикальная черта. Разделение происходит по каналам, за которыми следуют любые буквенно-цифровые символы и '=>'.

Символ '|' также используется в регулярных выражениях как своего рода оператор ИЛИ. Например:

split(/k|i|tt|y/)

Разделится на символ «k», «i», «tt» или «y».

0
ответ дан 18 December 2019 в 13:12
поделиться

Обрезав разделительные символы, мы получаем \|(?=\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], что и является желаемым результатом.

0
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: