#javascript #regex
#javascript #регулярное выражение
Вопрос:
У меня есть следующий код:
var html = "<div class='test'><b>Hello</b> <i>world!</i></div>";
var results = html.match(/<(/?) (w ) ([^>]*?)>/);
О трех наборах круглых скобок:
Первое значение: косая черта или ничего.
Второе значение: один или несколько буквенно-цифровых символов.
Третье значение: что-нибудь, кроме ‘>’, тогда я не понимаю ‘*?’!
Также как мне интерпретировать тот факт, что существует три набора круглых скобок, разделенных пробелами?
С уважением,
Комментарии:
1. Я думаю, что
?
в данном случае это излишне, поскольку вы уже*
.2. user278064:
*?
является ленивым квантификатором, сопоставляющим как можно меньше, при этом обеспечивая соответствие регулярного выражения.
Ответ №1:
*
означает «совпадение как можно большего количества» (возможно, нулевых символов) ранее определенного литерала,
?
означает: совпадение ровно настолько, чтобы регулярное выражение возвращало совпадение.
Пример:
String:
Tester>
[^>]*
Tester
[^>]*?
<empty string>
[^>]*e
Teste
[^>]*?e
Te (Including T is required to produce a valid match)
В вашем случае:
String:
<input value=">"> junk
[^>]*>
<input value=">">
[^>]*?>
<input value=">
Ответ №2:
Звездочка ( *
) означает совпадение предыдущего бита с нулем или более раз. Предыдущий бит [^>]
, означает что угодно, кроме a > . Как говорит @user278064, ?
это избыточно. Это предназначено для того, чтобы сделать *
нежадным, но в этом нет необходимости, поскольку [^>]
уже указано, на что *
следует ссылаться. (Вы могли бы заменить [^>]
на .
(точка / точка), который будет соответствовать любому символу, тогда ?
он будет соответствовать чему угодно, пока >
.)
Что касается пробелов, их там не должно быть … они буквально соответствуют пробелам, которые, я думаю, вам не нужны.
Ответ №3:
*?
в регулярных выражениях есть «ленивая звезда».
Звездочка означает «повторить предыдущий элемент ноль или более раз». Предыдущий элемент в этом случае — это символьный класс, который определяет «любой символ, кроме >
«.
По умолчанию звезда сама по себе является «жадной», что означает, что она будет соответствовать как можно большему количеству символов, при этом все еще удовлетворяя критериям для остальной части выражения вокруг нее.
Изменение его на ленивую звездочку путем добавления вопросительного знака означает, что вместо этого он будет соответствовать как можно меньшему количеству символов, сохраняя при этом соответствие остальным критериям.
В случае вашего выражения это фактически не будет иметь никакого значения для фактических результатов, потому что символ, который будет соответствовать сразу после звезды, равен a >
, что является полной противоположностью предыдущему совпадению. Это означает, что выражение всегда будет соответствовать одному и тому же результату для [^>]*
независимо от того, является ли оно ленивым или жадным.
В других регулярных выражениях разница более важна, потому что жадные выражения могут проглатывать части строки, которые в противном случае были бы сопоставлены позже в выражении.
Однако, хотя в результате может не быть никакой разницы, все же может быть разница между жадными и ленивыми выражениями, поскольку разные способы их обработки могут привести к тому, что выражения будут выполняться с разной скоростью. Опять же, я не думаю, что в вашем случае это сильно изменится, но в некоторых случаях это может оказать большое влияние.
Я рекомендую прочитать о регулярных выражениях на http://www.regular-expressions.info / — в нем есть отличная справочная таблица для всего синтаксиса регулярных выражений, который вам может понадобиться, и статьи по многим сложным темам.