Какая разница между этими регулярными выражениями

Я читаю исходный код 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] (пробел и не пустое пространство) [^] (не ничего)