Какая разница между этими регулярными выражениями
Я читаю исходный код Ionic. Я наткнулся на это регулярное выражение, и я очень озадачен этим.
([\s\S]+?)
Хорошо, он группируется на каждом char, который является либо пробелом, либо небелым пространством???
Почему они просто не делали
(.+?)
Я что-то упустил?
Ответы
Ответ 1
.
соответствует любому символу, но символу новой строки. Чтобы он соответствовал новой строке, на большинстве языков есть модификатор (dotall, singleline). Однако в JS такого модификатора нет.
Таким образом, обход должен состоять из символьного класса [\s\S]
, который будет соответствовать любому символу, включая новую строку, потому что \s
будет соответствовать всем пробелам, а \s
будет соответствовать всем символам без пробелов. Точно так же можно использовать [\d\D]
или [\w\W]
.
Кроме того, существует шаблон [^]
для сопоставления одной и той же вещи в JS, но поскольку он специфичен для JavaScript, регулярные выражения, содержащие этот шаблон, не являются переносимыми между ароматами регулярных выражений.
+?
ленивый quanitifier соответствует 1 или более символам, соответствующим предыдущему подшаблону, но как можно меньше. Таким образом, он будет соответствовать только 1 символу, если он используется в этом случае в конце шаблона.
Ответ 2
A .
соответствует всем, кроме символа новой строки. Это на самом деле хорошо известная/документированная проблема с javascript. \s
(совпадение пробелов) вместе с ним отрицание \s
(не-пробельное совпадение) обеспечивает соответствие dotall
, включая новую строку. Таким образом, [\s\S]
обычно используется чаще, чем .
Ответ 3
Во многих реализациях Regexp "." не соответствует новым строкам. Поэтому они используют "[\ s\S]" как маленький хак =)
Ответ 4
В RegEx, который они использовали, добавлено больше символов (по существу, все).
\s
соответствует любому символу слова или цифры или пробелу.
\s
соответствует чему угодно, кроме цифры, слова или пробела
Как отмечает Казимир:
.
соответствует любому символу, кроме новой строки (\n
)
Ответ 5
.
соответствует любому char кроме возврата каретки /r
и новой строки /n
Самый короткий способ сделать [/s/S]
(пробел и не пустое пространство) [^]
(не ничего)