Javascript.RU

Регулярные выражения

Регулярные выражения в javascript имеют особую краткую форму и стандартный PCRE-синтаксис.

Работают они через специальный объект RegExp.

Кроме того, у строк есть свои методы search,match,replace, но чтобы их понять - разберем-таки сначала RegExp.

Объект типа RegExp, или, короче, регулярное выражение, можно создать двумя путями

/pattern/флаги
new RegExp("pattern"[, флаги])

pattern - регулярное выражение для поиска (о замене - позже), а флаги - строка из любой комбинации символов g(глобальный поиск), i(регистр неважен) и m(многострочный поиск).

Первый способ используется часто, второй - иногда. Например, два таких вызова эквивалентны:

var reg = /ab+c/i
var reg = new RegExp("ab+c", "i")

При втором вызове - т.к регулярное выражение в кавычках, то нужно дублировать \

// эквивалентны
re = new RegExp("\\w+")
re = /\w+/

При поиске можно использовать большинство возможностей современного PCRE-синтаксиса.

Свернуть/Развернуть таблицу

Символ Значение
\ Для обычных символов - делает их специальными. Например, выражение /s/ ищет просто символ 's'. А если поставить \ перед s, то /\s/ уже обозначает пробельный символ.И наоборот, если символ специальный, например *, то \ сделает его просто обычным символом "звездочка". Например, /a*/ ищет 0 или больше подряд идущих символов 'a'. Чтобы найти а со звездочкой 'a*' - поставим \ перед спец. символом: /a\*/.
^ Обозначает начало входных данных. Если установлен флаг многострочного поиска ("m"), то также сработает при начале новой строки.Например, /^A/ не найдет 'A' в "an A", но найдет первое 'A' в "An A."
$ Обозначает конец входных данных. Если установлен флаг многострочного поиска, то также сработает в конце строки.Например, /t$/ не найдет 't' в "eater", но найдет - в "eat".
* Обозначает повторение 0 или более раз. Например, /bo*/ найдет 'boooo' в "A ghost booooed" и 'b' в "A bird warbled", но ничего не найдет в "A goat grunted".
+ Обозначает повторение 1 или более раз. Эквивалентно {1,}. Например, /a+/ найдет 'a' в "candy" и все 'a' в "caaaaaaandy".
? Обозначает, что элемент может как присутствовать, так и отсутствовать. Например, /e?le?/ найдет 'el' в "angel" и 'le' в "angle."Если используется сразу после одного из квантификаторов *, +, ?, или {}, то задает "нежадный" поиск (повторение минимально возможное количество раз, до ближайшего следующего элемента паттерна), в противоположность "жадному" режиму по умолчанию, при котором количество повторений максимально, даже если следующий элемент паттерна тоже подходит.Кроме того, ? используется в предпросмотре, который описан в таблице под (?=), (?!), и (?: ).
. (Десятичная точка) обозначает любой символ, кроме перевода строки: \n \r \u2028 or \u2029. (можно использовать [\s\S] для поиска любого символа, включая переводы строк). Например, /.n/ найдет 'an' и 'on' в "nay, an apple is on the tree", но не 'nay'.
(x) Находит x и запоминает. Это называется "запоминающие скобки". Например, /(foo)/ найдет и запомнит 'foo' в "foo bar." Найденная подстрока хранится в массиве-результате поиска или в предопределенных свойствах объекта RegExp: $1, ..., $9.Кроме того, скобки объединяют то, что в них находится, в единый элемент паттерна. Например, (abc)* - повторение abc 0 и более раз.
(?:x) Находит x, но не запоминает найденное. Это называется "незапоминающие скобки". Найденная подстрока не сохраняется в массиве результатов и свойствах RegExp.Как и все скобки, объединяют находящееся в них в единый подпаттерн.
x(?=y) Находит x, только если за x следует y. Например, /Jack(?=Sprat)/ найдет 'Jack', только если за ним следует 'Sprat'. /Jack(?=Sprat|Frost)/ найдет 'Jack', только если за ним следует 'Sprat' или 'Frost'. Однако, ни 'Sprat' nor 'Frost' не войдут в результат поиска.
x(?!y) Находит x, только если за x не следует y. Например, /\d+(?!\.)/ найдет число, только если за ним не следует десятичная точка. /\d+(?!\.)/.exec("3.141") найдет 141, но не 3.141.
x|y Находит x или y. Например, /green|red/ найдет 'green' в "green apple" и 'red' в "red apple."
{n} Где n - положительное целое число. Находит ровно n повторений предшествующего элемента. Например, /a{2}/ не найдет 'a' в "candy," но найдет оба a в "caandy," и первые два a в "caaandy."
{n,} Где n - положительное целое число. Находит n и более повторений элемента. Например, /a{2,} не найдет 'a' в "candy", но найдет все 'a' в "caandy" и в "caaaaaaandy."
{n,m} Где n и m - положительные целые числа. Находят от n до m повторений элемента.
[xyz] Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире. Например, [abcd] - то же самое, что [a-d]. Найдет 'b' в "brisket" и 'c' в "ache".
[^xyz] Любой символ, кроме указанных в наборе. Вы также можете указать промежуток. Например, [^abc] - то же самое, что [^a-c]. Найдет 'r' в "brisket" и 'h' в "chop."
[\b] Находит символ backspace. (Не путать с \b.)
\b Находит границу слов (латинских), например пробел. (Не путать с [\b]). Например, /\bn\w/ найдет 'no' в "noonday"; /\wy\b/ найдет 'ly' в "possibly yesterday."
\B Обозначает не границу слов. Например, /\w\Bn/ найдет 'on' в "noonday", а /y\B\w/ найдет 'ye' в "possibly yesterday."
\cX Где X - буква от A до Z. Обозначает контрольный символ в строке. Например, /\cM/ обозначает символ Ctrl-M.
\d находит цифру из любого алфавита (у нас же юникод). Испльзуйте [0-9], чтобы найти только обычные цифры. Например, /\d/ или /[0-9]/ найдет '2' в "B2 is the suite number."
\D Найдет нецифровой символ (все алфавиты). [^0-9] - эквивалент для обычных цифр. Например, /\D/ или /[^0-9]/ найдет 'B' в "B2 is the suite number."
\f,\r,\n Соответствующие спецсимволы form-feed, line-feed, перевод строки.
\s Найдет любой пробельный символ, включая пробел, табуляцию, переводы строки и другие юникодные пробельные символы. Например, /\s\w*/ найдет ' bar' в "foo bar."
\S Найдет любой символ, кроме пробельного. Например, /\S\w*/ найдет 'foo' в "foo bar."
\t Символ табуляции.
\v Символ вертикальной табуляции.
\w Найдет любой словесный (латинский алфавит) символ, включая буквы, цифры и знак подчеркивания. Эквивалентно [A-Za-z0-9_]. Например, /\w/ найдет 'a' в "apple," '5' в "$5.28," и '3' в "3D."
\W Найдет любой не-(лат.)словесный символ. Эквивалентно [^A-Za-z0-9_]. Например, /\W/ и /[^$A-Za-z0-9_]/ одинаково найдут '%' в "50%."
\n где n - целое число. Обратная ссылка на n-ю запомненную скобками подстроку. Например, /apple(,)\sorange\1/ найдет 'apple, orange,' в "apple, orange, cherry, peach.". За таблицей есть более полный пример.
\0 Найдет символ NUL. Не добавляйте в конец другие цифры.
\xhh Найдет символ с кодом hh (2 шестнадцатиричных цифры)
\uhhhh Найдет символ с кодом hhhh (4 шестнадцатиричных цифры).

Чтобы просто проверить, подходит ли строка под регулярное выражение, используется метод test:

if ( /\s/.test("строка") ) {
...В строке есть пробелы!...
}

Метод exec возвращает массив и ставит свойства регулярного выражения.
Если совпадений нет, то возвращается null.

Например,

// Найти одну d, за которой следует 1 или более b, за которыми одна d
// Запомнить найденные b и следующую за ними d
// Регистронезависимый поиск
var myRe = /d(b+)(d)/ig;
var myArray = myRe.exec("cdbBdbsbz");

В результате выполнения скрипта будут такие результаты:

Объект Свойство/Индекс Описания Пример
myArray Содержимое myArray. ["dbBd", "bB", "d"]
index Индекс совпадения (от 0) 1
input Исходная строка. cdbBdbsbz
[0] Последние совпавшие символы dbBd
[1], ...[n] Совпадения во вложенных скобках, если есть. Число вложенных скобок не ограничено. [1] = bB
[2] = d
myRe lastIndex Индекс, с которого начинать следующий поиск. 5
ignoreCase Показывает, что был включен регистронезависимый поиск, флаг "i". true
global Показывает, что был включен флаг "g" поиска всех совпадений. true
multiline Показывает, был ли включен флаг многострочного поиска "m". false
source Текст паттерна. d(b+)(d)

Если в регулярном выражении включен флаг "g", Вы можете вызывать метод exec много раз для поиска последовательных совпадений в той же строке. Когда Вы это делаете, поиск начинается на подстроке str, с индекса lastIndex. Например, вот такой скрипт:

var myRe = /ab*/g;
var str = "abbcdefabh";
while ((myArray = myRe.exec(str)) != null) {
	var msg = "Found " + myArray[0] + ".  ";
	msg += "Next match starts at " + myRe.lastIndex;
	print(msg);
}

Этот скрипт выведет следующий текст:

Found abb. Next match starts at 3
Found ab. Next match starts at 9

В следующем примере функция выполняет поиск по input. Затем делается цикл по массиву, чтобы посмотреть, есть ли другие имена.

Предполагается, что все зарегистрированные имена находятся в массиве А:

var A = ["Frank", "Emily", "Jane", "Harry", "Nick", "Beth", "Rick",
         "Terrence", "Carol", "Ann", "Terry", "Frank", "Alice", "Rick",
         "Bill", "Tom", "Fiona", "Jane", "William", "Joan", "Beth"];

function lookup(input)
{
  var firstName = /\w+/i.exec(input);
  if (!firstName)
  {
    print(input + " isn't a name!");
    return;
  }

  var count = 0;
  for (var i = 0; i < A.length; i++)
  {
    if (firstName[0].toLowerCase() == A[i].toLowerCase())
      count++;
  }
  var midstring = (count == 1) ? " other has " : " others have ";
  print("Thanks, " + count + midstring + "the same name!")
}

Следующие методы работают с регулярными выражениями из строк.

Все методы, кроме replace, можно вызывать как с объектами типа regexp в аргументах, так и со строками, которые автоматом преобразуются в объекты RegExp.

Так что вызовы эквивалентны:

var i = str.search(/\s/)
var i = str.search("\\s")

При использовании кавычек нужно дублировать \ и нет возможности указать флаги, поэтому иногда бывает удобна и полная форма

var i = str.search(new RegExp("\\s","g"))

Возвращает индекс регулярного выражения в строке, или -1.

Если Вы хотите знать, подходит ли строка под регулярное выражение, используйте метод search(аналогично RegExp-методы test). Чтобы получить больше информации, используйте более медленный метод match(аналогичный методу RegExp exec).

Этот пример выводит сообщение, в зависимости от того, подходит ли строка под регулярное выражение.

function testinput(re, str){
   if (str.search(re) != -1)
      midstring = " contains ";
   else
      midstring = " does not contain ";
   document.write (str + midstring + re.source);
}

Если в regexp нет флага g, то возвращает тот же результат, что regexp.exec(string).

Если в regexp есть флаг g, то возвращает массив со всеми совпадениями.

Чтобы просто узнать, подходит ли строка под регулярное выражение regexp, используйте regexp.test(string).

Если Вы хотите получить первый результат - попробуйте regexp.exec(string).

В следующем примере match используется, чтобы найти "Chapter", за которой следует 1 или более цифр, а затем цифры, разделенные. В регулярном выражении есть флаг i, так что регистр будет игнорироваться.

str = "For more information, see Chapter 3.4.5.1";
re = /chapter (\d+(\.\d)*)/i;
found = str.match(re);
alert(found);

Скрипт выдаст массив из совпадений:

  • Chapter 3.4.5.1 - полностью совпавшая строка
  • 3.4.5.1 - первая скобка
  • .1 - внутренняя скобка

Следующий пример демонстрирует использование флагов глобального и регистронезависимого поиска с match. Будут найдены все буквы от А до Е и от а до е, каждая - в отдельном элементе массива.

var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var regexp = /[A-E]/gi;
var matches = str.match(regexp);
document.write(matches);

// matches = ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']

Метод replace может заменять вхождения регулярного выражения не только на строку, но и на результат выполнения функции. Его полный синтаксис - такой:

var newString = str.replace(regexp/substr, newSubStr/function)
regexp
Объект RegExp. Его вхождения будут заменены на значение, которое вернет параметр номер 2
substr
Строка, которая будет заменена на newSubStr.
newSubStr
Строка, которая заменяет подстроку из аргумента номер 1.
function
Функция, которая может быть вызвана для генерации новой подстроки (чтобы подставить ее вместо подстроки, полученной из аргумента 1).

Метод replace не меняет строку, на которой вызван, а просто возвращает новую, измененную строку.

Чтобы осуществить глобальную замену, включите в регулярное выражение флаг "g".

Если первый аргумент - строка, то она не преобразуется в регулярное выражение, так что, например,

var ab = "a b".replace("\\s","..") // = "a b"

Вызов replace оставил строку без изменения, т.к искал не регулярное выражение \s, а строку "\s".

В строке замены могут быть такие спецсимволы:

Pattern Inserts
$$ Вставляет "$".
$& Вставляет найденную подстроку.
$` Вставляет часть строки, которая предшествует найденному вхождению.
$' Вставляет часть строки, которая идет после найденного вхождения.
$n or $nn Где n или nn - десятичные цифры, вставляет подстроку вхождения, запомненную n-й вложенной скобкой, если первый аргумент - объект RegExp.

Если Вы указываете вторым параметром функцию, то она выполняется при каждом совпадении.

В функции можно динамически генерировать и возвращать строку подстановки.

Первый параметр функции - найденная подстрока. Если первым аргументом replace является объект RegExp, то следующие n параметров содержат совпадения из вложенных скобок. Последние два параметра - позиция в строке, на которой произошло совпадение и сама строка.

Например, следующий вызов replace возвратит XXzzzz - XX , zzzz.

function replacer(str, p1, p2, offset, s)
{
return str + " - " + p1 + " , " + p2;
}
var newString = "XXzzzz".replace(/(X*)(z*)/, replacer)

Как видите, тут две скобки в регулярном выражении, и потому в функции два параметра p1, p2.
Если бы были три скобки, то в функцию пришлось бы добавить параметр p3.

Следующая функция заменяет слова типа borderTop на border-top:

function styleHyphenFormat(propertyName)
{
  function upperToHyphenLower(match)
  {
    return '-' + match.toLowerCase();
  }
  return propertyName.replace(/[A-Z]/, upperToHyphenLower);
}

Для общего понимания регулярных выражений можно почитать Статью в wikipedia.

Более подробно они описаны в книге (англ.) Beginning Regular Expressions.


Автор: KOLANICH, дата: 22 ноября, 2008 - 23:52
#permalink

\/-это косая черта?


Автор: Илья Кантор, дата: 23 ноября, 2008 - 08:24
#permalink

Это косая черта "/", внутри регекспа /.../ она экранируется бэкслешем "\".
Например, регексп только для косой черты выглядит вот так: /\//


Автор: Тёмик (не зарегистрирован), дата: 27 декабря, 2008 - 00:41
#permalink

Помогите пожалуйста!

В переменной str находятся несколько слов, разделённых между собой пробелом. Нужно записать в массив myArray только те из них, которые начинаются с a и заканчиваются на b. Т.е. что-то вроде:

var str = 'ab aa acb abc acdcdcdb'
var myRe = /текст паттерна/gi
var myArray = myRe.exec(str);

В результате должно получиться:

myArray[0] = 'ab'
myArray[1] = 'acb'
myArray[2] = 'acdcdcdb'

Вопрос: что писать в тексте паттерна?


Автор: Minh (не зарегистрирован), дата: 20 мая, 2009 - 09:32
#permalink

Если пользуетесь exec, то вам понадобится цикл, думаю лучше использовать match в вашем случае, можно например так:

var str = 'ab aa acb abc acdcdcdb'
var myRe = /\ba\w*b\b/gi
document.write(str.match(myRe))


Автор: aldan8, дата: 21 сентября, 2009 - 00:48
#permalink

Или ещё с таким патерном:

var pat = /a(\w)*b(\s|\0)/g
var str = "ab aa acb abc acdcdcdb sdabxx abxxxxxb abyyyyy"
var arrRes = str.match(pat)
for(var i = 0; i<arrRes.length; i++)
   document.write(arrRes[i] + ' <br />')

Автор: Гость (не зарегистрирован), дата: 27 декабря, 2008 - 21:00
#permalink

Разбей на массив эту строку, как explode в php, и потом ^a*b$


Автор: Тёмик (не зарегистрирован), дата: 27 декабря, 2008 - 23:10
#permalink

Не пойму зачем на массив разбивать? Смысл?

Ну. допустим. разбил - не фурычит! В качестве результата ничего не выдаёт.

Я с JS знаком всего-лишь немногим больше недели. Можно всё немного поподробней объяснить? Даже лучше исходник скрипта готовый выложи.


Автор: Гость (не зарегистрирован), дата: 29 декабря, 2008 - 18:33
#permalink

Как ты разбил? Что за вопросы насчёт "смысла" ? Тебе в итоге же массив и нужен, тогда какие оправдания чем этот способ не устаивает?
Надеюсь пробелы выкинул? Найди аналог phpшного explode, если не знаешь как правильно организовать. PHP JS тебе в лапы.
Потом в цикле for пробегаешься по массиву (не ищи в манах ссылок вида & и прочего php-дерьма, в JS массив СРАЗУ передаётся по жёсткой ссылке), если регексп не удовлетворяет - удаляешь его нахрен из массива. Вот и всё готово, в массиве останется только то что нужно. Исходник некогда ваять, время $$$.


Автор: latteo (не зарегистрирован), дата: 2 января, 2009 - 18:59
#permalink

Подскажите нубу через что можно поиск по всей странице сделать, пробовал через вариации win.document.getElementByTag('body').innerHTML не хочет Sad


Автор: latteo, дата: 3 января, 2009 - 00:08
#permalink

Ура научился document.body.innerHTML помог и статья http://javascript.ru/start/dom/intro


Автор: Гость (не зарегистрирован), дата: 15 февраля, 2009 - 14:21
#permalink

Вообще все материалы на сайте - лишь описание голой теории. Только домен зря занимаете.


Автор: Илья Кантор, дата: 16 февраля, 2009 - 10:30
#permalink

А что бы вы предложили разместить на этом домене?


Автор: Гость (не зарегистрирован), дата: 18 февраля, 2009 - 13:17
#permalink

По JavaScript есть много информации, очень много, но вся она разрозненная, и большей частью по форумам.

Например, простое желание запихнуть проверку правильности электронной почты выливается в изучение всего синтаксиса JS, теории регулярных выражений и экспериментирования с вариантами.

Почему нельзя приводить наиболее популярные примеры? Чтобы человек, который обратился к JS только за этим и не желает его изучать, мог копипастом решить свою несложную задачу?

Или чтобы не пришлось по 20 минут искать функцию для копирования 2 первых символов из текстовой строки, при этом залазя на php.ru и потом только изучая аналоги здесь.

Есть пословица: назвался груздем - полезай в кузов. Если назвались javascript.ru, так проявляйте интерес, либо отдайте домен тому кто сможет его больше привести в порядок.


Автор: Илья Кантор, дата: 18 февраля, 2009 - 15:45
#permalink

То есть, вы бы предложили добавить на сайт раздел "примеров кода" с наиболее актуальными примерами?

Только это или что-то еще ?


Автор: AzriMan, дата: 2 апреля, 2009 - 16:47
#permalink

кстати, хорошая идея!


Автор: Илья Кантор, дата: 20 мая, 2009 - 14:47
#permalink

Имхо такие сайты с примерами скриптов - пережиток прошлого. Вымрут аки динозавры.


Автор: Гость (не зарегистрирован), дата: 3 июля, 2009 - 22:39
#permalink

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


Автор: Alexander.K (не зарегистрирован), дата: 12 февраля, 2010 - 06:45
#permalink

А подписаться слабо было, критик? Сам-то чего полезного сделал?


Автор: Андрей Параничев, дата: 18 февраля, 2009 - 17:09
#permalink

Книги по высшей математике - лишь описание голой теории. Только зря место на полке занимают. Почему бы в них не писать просто ответы на популярные примеры, чтоб человек, которому совершенно безразлична математика, мог просто скопировать ответ?


Автор: Гость (не зарегистрирован), дата: 14 марта, 2009 - 03:32
#permalink

+1
Что толку от того, что книга называется "Интегральные исчисления", если там нет точно моего примера??? Товарищ, любитель готовых кодов освободите домен brain.ru


Автор: Гость (не зарегистрирован), дата: 15 мая, 2009 - 21:29
#permalink

+1
Важны и теория и практические примеры. Главное хор организованная теория с мальенькими примерами. А решения конкретных задач в отдельных статьях в отдельном от теории разделе. Небольшое удобство когда из теории в (соответствующие) статьи (и наоборот) будут ссылки. В внизу отобразить несколько коментов, с ссылкой смотреть все коменты. Коменты как обсуждение и рассмотрение вопросов к теме (или статье).
Хор Сайт, за это Спасибо!


Автор: Se_Pe (не зарегистрирован), дата: 19 марта, 2009 - 14:12
#permalink

Подскажите, почему если в примере:

...
var newString = "XXzzzz".replace(/(X*)(z*)/, replacer)

заменить строку XXzzzz на например aaaXXzzzz, то того же результата не получиться. И что нужно написать в паттерне, чтоб получить тот же результат, что и в первом случае?


Автор: RC (не зарегистрирован), дата: 23 августа, 2009 - 20:45
#permalink

Вообще, не очень понятно какой результат нужно получить, но думаю если написать вот так

var newString = "XXzzzz".replace(/.*(X*)(z*)/, replacer)

то должно помочь.


Автор: Гость (не зарегистрирован), дата: 22 марта, 2009 - 20:26
#permalink

а как быть если нужно заменить расширение допустим albom/123123.jpeg jpeg на html


Автор: B@rmaley.e><e (не зарегистрирован), дата: 6 мая, 2009 - 11:59
#permalink
'albom/123123.jpeg'.replace(/\.jpeg$/i,'.html');

Автор: Alekson, дата: 7 июля, 2009 - 14:43
#permalink

Как сделать просмотр назад?
?<= и ?#n не работают.


Автор: Илья Кантор, дата: 7 июля, 2009 - 21:22
#permalink

Попробуйте \\1


Автор: orange, дата: 21 января, 2010 - 23:16
#permalink

то же возникла такая проблема Sad а что значит \\1, где и как именно писать?


Автор: orange, дата: 21 января, 2010 - 23:46
#permalink

да и вообще, есть ли просмотр назад в ECMAScript v 3? В книге Дэвида Флэнагана(JS подробное руководство, 5 изд) написано следующее:

11.1.7. Средства регулярных выражений Perl, не поддерживаемые в JavaScript
Мы говорили, что ECMAScript v3 определяет относительно полное подмножество средств регулярных выражений из Perl 5. Развитые средства Perl, не поддерживаемые ECMAScript, включают следующее:
• флаги s (однострочный режим) и x (расширенный синтаксис);
• управляющие последовательности \a, \e, \l, \u, \L, \U, \E, \Q, \A, \Z, \z и \G;
• (?<= – положительное условие на предыдущие символы и отрицатель
ное условие на предыдущие символы;
• комментарий (?# и прочий расширенный синтаксис (?.


Автор: jed (не зарегистрирован), дата: 7 октября, 2009 - 00:13
#permalink

Начал эксперементировать с примером разбора "3.4.5.1"

text = "Chapter 3.4.5.1";
regex = /chapter (?Sad\d)(\.\d)?(\.\d)?(\.\d)?)/i;
result = text.match(regex);
result[0] = '';
Log("result = " + result);

Показывает: result = ,3,.4,.5,.1
Как раз то, что надо - каждая цифра отделено.

regex = /chapter (\d)((\.\d)+)/i;
Показывает: result = ,3,.4.5.1,.1
Это неудача - первая цифра отдельно, остальные вместе .4.5.1

Вопрос: как изменить второй regex, чтобы он выдавал как первый, но был без этих повторов (\.\d)?(\.\d)?(\.\d)?


Автор: jed (не зарегистрирован), дата: 7 октября, 2009 - 00:15
#permalink
text = "Chapter 3.4.5.1";
  regex = /chapter (?:(\d)(\.\d)?(\.\d)?(\.\d)?)/i;
  result = text.match(regex);
  result[0] = '';
  Log("result = " + result);

Автор: subzey (не зарегистрирован), дата: 5 ноября, 2009 - 17:50
#permalink

[xyz] Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире

Ох, не тире, а дефис. Хотя и употребляется в смысле «тире».


Автор: Ыфьфдлщ (не зарегистрирован), дата: 20 ноября, 2009 - 00:52
#permalink

народ помогите плиз составить регулярку а то немогу сделать как надо

вот приблизительно строка

Kuzyаааaj456 dfdf наградил федю

надо разделить строку на 2 части до наградил и после
при этом Kuzyаааaj456 dfdf может состоять из Nго количества слов, букв, и содержать любые символы (лат\нелат\цифры\спецсимволы)


Автор: Гость (не зарегистрирован), дата: 21 ноября, 2009 - 10:24
#permalink

/(.+?) наградил (.+?)/


Автор: Ыфьфдлщ (не зарегистрирован), дата: 22 ноября, 2009 - 21:42
#permalink

спасибо но чет непомогло первая переменная отобразилась верно а от второй одна буква (


Автор: ATr (не зарегистрирован), дата: 23 ноября, 2009 - 15:59
#permalink

/^(.+?) наградил (.+?)$/


Автор: Гость (не зарегистрирован), дата: 8 декабря, 2009 - 20:54
#permalink

написано чтобы напомнить но никак не объяснить. Оценка 2


Автор: Гость (не зарегистрирован), дата: 8 февраля, 2010 - 18:50
#permalink

+1
Человеку, первый раз встречающемуся с регулярными выражениями, очень тяжело понять по этой статье, как же их надо использовать


Автор: Астра (не зарегистрирован), дата: 22 декабря, 2009 - 20:10
#permalink

не могу въехать в "запоминающие скобки" (вроде, куда уж проще)
Мне нужно из страницы выбрать и запомнить определенные числа (положительные и отрицательные) . Посоветовали воспользоваться match, а числа обрамить псевдотегами. вот какой паттен в итоге получился:

var rates = data.match(/<!--comRate-->(-?\d+)<!--\/comRate-->/g);

но когда проверяю alert (rates); массив выдает вместе с псевдотегами (типа 1, -1)
где я ошиблась


Автор: Астра (не зарегистрирован), дата: 22 декабря, 2009 - 20:12
#permalink

*блин, комменты ушли
но когда проверяю alert (rates); массив выдает вместе с псевдотегами (типа

<!--comRate-->1<!--/comRate-->, <!--comRate-->-1<!--/comRate-->

)


Автор: subzey, дата: 23 декабря, 2009 - 00:23
#permalink

В результирующем массиве содержимое скобок находится начиная с индекса 1.

Например:

var a = /\s*(+7|8)[\s\-\(]+(\d{3})[\s\-\)]+(\d{3})[-\s]+(\d{2})[-\s]+(\d{2})\s*/.exec(" +7 (901) 234 56 78 ");
a[0]; /*  +7 (901) 234 56 78  */
a[1]; /* +7 */
a[2]; /* 901 */
a[3]; /* 234 */
a[4]; /* 56 */
a[5]; /* 78 */
a[6]; /* undefined */

Автор: Гость (не зарегистрирован), дата: 29 декабря, 2009 - 17:11
#permalink

Объясните разницу между [0-9] и \d
В коде ниже [0-9] и \d дают разные результаты, true и fasle соответственно.
Кодировка файла utf-8

var pattern = new RegExp('^[0-9]{7,8}$');
var str='1234567';
alert(pattern.test(str));

Автор: Илья Кантор, дата: 29 декабря, 2009 - 18:58
#permalink

Никакой. Но не забываем экранировать, раз уж используем кавычки:

var pattern = new RegExp('^\\d{7,8}$');
...

Автор: bga, дата: 8 января, 2010 - 16:54
#permalink

вот еще полезный метод для оптимизации регулярных выражений RegExp.compile


Автор: Ц52 (не зарегистрирован), дата: 23 января, 2010 - 16:24
#permalink

Вот тут смотрю ваше руководство
Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире. Например, [abcd] - то же самое, что [a-d]. Найдет 'b' в "brisket" и 'c' в "ache".

Очень не понятно почему 'c' в "ache" . Сначала проверил а - английская (подумал что русская сначала). Потом зашел http://www.pcre.ru/eval/ и проверил там. Выдает результат поиска:
0: (a)
1: (c)
Т.е. найдет и а и c. Вопрос так почему будет c?


Автор: tuschkan, дата: 23 февраля, 2010 - 14:19
#permalink

Задача состоит в том, чтобы проверять вводимое значении на соответствие шаблону 4 цифры/2 цифры или тоже самое без"/" (номер дома через дробь: 457/5) или просто номер дома.

У меня такое выражение:\d{1,4}\/\d{1,2}|\d{1,4}
но оно допускает и буквы и точки и прочие знаки. Подскажите, пожалуйста, как мне разрешить только цифры и косую?


Автор: T0xA (не зарегистрирован), дата: 4 марта, 2010 - 03:08
#permalink

подскажите пожалуйста

var myRe = /(.*)\.(.*)/;
myRe.exec('el1.el2');

возвращает: el1.el2,el1,el2

el1.el2 - мне не нужно.
я догадываюсь из-за чего это происходит, но возможно ли как то сделать чтоб не проходило условие в котором есть точка?


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
5 + 13 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Статьи и мероприятия

Будьте в курсе наших последних новостей!

Ответьте, пожалуйста..
О чем бы вы хотели услышать на конференции по javascript?

На какие темы послушать доклады? Конференция состоится в середине мая.


Последние обсуждения на форуме
Forum
Последние комментарии