Как вы читаете это регулярное выражение JavaScript? - PullRequest
4 голосов
/ 09 ноября 2008
var pattern = /^0+$/;

Я думаю, это:

«Посмотрите как начало, так и конец строки, и если в начале и конце есть шаблон из одного или нескольких нулей, верните этот шаблон».

Я уверен, что это неправильно, потому что, когда я запускаю выражение с этой строкой:

var string = "0000009000000";

Это приходит null.

Так что же на самом деле говорит? И пока я спрашиваю, что / как JavaScript учитывает начало, середину и конец строки?

ОБНОВЛЕНИЕ № 1: Спасибо за ответы! Я думаю, что понимаю это сейчас. Моя путаница проистекала из того факта, что я представляю строку как начало, середину и конец. Как это:

[начало] [средний] [конец]

Другими словами, для приведенной выше строки следующие выражения работают так, как я ожидаю:

/^0+/; возвращает "000000" (шаблон из одного или нескольких нулей в начале строки)

и

/0+$/; возвращает «000000» (шаблон из одного или нескольких нулей в конце строки)

ОБНОВЛЕНИЕ № 2: Я перевесил все ответы на этот вопрос, потому что они все полезны, и я собрал ответы в один большой большой:

С учетом следующего кода JavaScript:

var string = "0000009000000";
var regExp = /^0+$/; 
alert(regExp.exec(string));

Частично это звучит так:

"Если точный символ (символы), за которым следует модификатор ^ и которому предшествует модификатор $ в регулярном выражении, не ОДНОВРЕМЕННО сидят в первой позиции (ях) строки И в последней позиции (ях) строки (т. е. они не являются единственным символом (ами) в строке), затем возвращают null. Иначе, возвращают символ (ы). "

Другими словами, допустим, что данная строка состоит из шести нулей «000000». Это приводит к совпадению, потому что точно такая же группа символов «0» находится в ОБА первых позициях ( 1-й 2-й 3 * 4-й 5-й 6-й) И последних позициях (1-й 2-й 3 4-й 5-й 6-й ) строки.

Однако в исходной данной строке есть шесть нулей, за которыми следуют девять, а затем шесть нулей («0000009000000»). Теперь шесть нулей в первых позициях строки (1-й, 2-й, 3-й, 4-й, 5-й, 6-й) НЕ являются точно такими же шестью нулями, сидящими в последних позициях строки (8-й, 9-й, 10-й, 11-й, 12-й) 13). Следовательно, null возвращается.

Ответы [ 8 ]

10 голосов
/ 09 ноября 2008

Он говорит, что ваша строка содержит только 0 ... она должна начинаться, затем иметь 1 или более 0, а затем заканчиваться.

7 голосов
/ 09 ноября 2008

^ 0 + $

  • Утверждение позиции в начале строки «^»
  • Соответствует символу «0» буквально «0+»
    • От одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «+»
  • Утверждение позиции в конце строки (или до разрыва строки в конце строки, если есть) «$»
2 голосов
/ 09 ноября 2008

Шаблон по крайней мере из одной 0 , привязанный как к началу ( ^ ), так и к концу ( $ ) линии; другими словами, строка состоит из одного или нескольких нулей.

Для сопоставления строки, состоящей из цифр от 0 до 9 и начинающейся и заканчивающейся хотя бы одним нулем, шаблон

/^0+[0-9]+0$/

будет работать, т. Е. Соответствовать одному или нескольким нулям, затем одной или нескольким цифрам 0-9, оканчивающимся на ноль.

Если не указано иное, JavaScript будет обрабатывать всю строку как одну строку, игнорируя символы новой строки; чтобы заставить его рассматривать несколько отдельных строк, используйте модификатор m , например

/regex/m

См. Также: Обзор регулярных выражений JavaScript в Mozilla Developer Center

2 голосов
/ 09 ноября 2008

Если вы хотите, чтобы оно совпадало с вашей строкой, вы хотите, чтобы ваше регулярное выражение было примерно таким:

var pattern = /^0+.*0+$/

Это будет соответствовать 1 или более '0 в начале, 1 или более' 0 в конце и 0 или более в середине.

1 голос
/ 11 ноября 2008

@ CodeCurious, вы все еще делаете это сложнее, чем нужно. Регулярное выражение /^0+$/ просто означает, что вся строка состоит из одного или нескольких нулей. Регулярные выражения предлагают множество возможностей для путаницы, поэтому примите простоту везде, где вы можете ее найти.

1 голос
/ 09 ноября 2008

Отвечая на ваше обновление - вы вроде как правы. Строка, с которой будет пытаться найти регулярное выражение, имеет начало, середину и конец.

Но знаете что? Все строки имеют начало и конец.

Ваше регулярное выражение говорит, что строка должна иметь начало, конец и между двумя , только строкой нулей.

Не думайте, что ваш 000000 находится в начале, или ваш 900000 как в конце. Фактически, на мгновение игнорируйте идею начала и конца.

  • Это регулярное выражение соответствует "где-то должно быть несколько нулей": /0+/
  • Это совпадение с регулярным выражением "должно содержать несколько нулей и ничего больше : /^0+$/

почему мы добавляем ^ и $?

Поскольку для регулярных выражений нет «и ничего больше», мы должны указать «начало строки, несколько нулей, конец строки», что означает то же самое.

Кстати, вы тоже ошиблись:

если в начале и в конце есть шаблон из одного или нескольких нулей, то вернуть этот шаблон

ваше регулярное выражение не будет возвращать "этот шаблон", оно будет возвращать только true. Вам нужны скобки, чтобы получить шаблон: /^(0+)$/

0 голосов
/ 09 ноября 2008

Я всегда вкладываю слова своего Регекса в человеческие слова, чтобы убедиться, что это то, что я имел в виду.

Это: ^ 0 + $

будет выглядеть следующим образом: «Если из начала (^) моей строки вы найдете хотя бы один (+) ноль (0) и ничего больше до конца ($) строки.»

Помните, что регулярное выражение - это, по сути, набор операторов If. Итак, во-первых, оно должно быть «правдивым», а затем оно вернет наилучший возможный результат. Regex никогда не вернет «несколько правдивый» или «в основном истинный» результат.

0 голосов
/ 09 ноября 2008
/(^0+|0+$)/
...