Мастер-классы по Javascript, AJAX/COMET, jQuery Узнать больше...
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", а также 'a' и '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, дата: 23 ноября, 2008 - 00:52
#permalink

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


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

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


Автор: Тёмик (не зарегистрирован), дата: 27 декабря, 2008 - 01: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 - 10: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 - 01: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 />')

Автор: MainBuh (не зарегистрирован), дата: 30 июля, 2010 - 14:16
#permalink

Извините, что постоянно повторяюсь но просто вы "изобрели столько велосипедов", а про стандартную функцию объекта String забыли!!!
var arr = 'ab aa acb abc acdcdcdb'.split(' ');


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

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


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

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

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

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


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

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


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

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


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

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


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

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

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

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


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

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

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

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


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

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


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

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

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


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

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


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

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


Автор: orange, дата: 22 января, 2010 - 00: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 - 01: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)?


Автор: MainBuh (не зарегистрирован), дата: 30 июля, 2010 - 14:11
#permalink

arrRez = "Chapter 3.4.5.1".replace(/[^\d\.]/g,'').split('.');


Автор: jed (не зарегистрирован), дата: 7 октября, 2009 - 01: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 - 18:50
#permalink

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

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


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

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

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

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

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


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

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


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

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


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

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


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

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


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

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


Автор: Илья Кантор, дата: 13 марта, 2010 - 03:38
#permalink

Эта статья ни в коей мере не ставит целью научить регулярным выражениям. Скорее она для тех, кто уже знает, что такое регэкспы и изучает их работу с ними в javascript.


Автор: Гость (не зарегистрирован), дата: 28 июля, 2010 - 01:33
#permalink

Для тех кто хочет научится писать хорошие популярные статьи:
1. в начале статьи приводится Аннотация ( в которой кратко приводится как содержание статьи, так и характеристика потенциальной читательской аудитории)
2. в конце статьи приводится списки использованной и рекомендуемой литературы (для рекомендуемой литературы ссылки на википедию и мануалы - не катят, хотя в использованной литературе могут быть приведены)
3. совсем шикарно, если рекомендованная (не использованная, а, именно, рекомендуемая) литература снабжена аннотацией
4. для всего списка литературы приводится язык и год издания


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

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

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

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


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

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

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

)


Автор: subzey, дата: 23 декабря, 2009 - 01: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 */

Автор: Гость (не зарегистрирован), дата: 28 июля, 2010 - 01:48
#permalink

При использовании функции копирование в буфер - не сохраняются переводы каретки


Автор: Гость (не зарегистрирован), дата: 29 декабря, 2009 - 18: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 - 19:58
#permalink

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

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

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

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


Автор: Ц52 (не зарегистрирован), дата: 23 января, 2010 - 17: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 - 15:19
#permalink

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

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


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

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

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

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

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


Автор: immeasurability (не зарегистрирован), дата: 12 марта, 2010 - 16:21
#permalink

подскажите пжз!

есть выражение replace(/(\[.*\])/gi,'xxx') которое меняет все что находится в скобках на xxx что дописать в эту часть /(\[.*\])/gi для того чтобы менялось все что в скобках и один любой символ с лева?

к примеру есть текст www-[yyy]-zzz нужно чтоб все что в скобках и знак минус был заменен -[yyy], но с лева может быть не только знак минус но и любой другой символ!

Спасибо за внимание!!!


Автор: EugenyK, дата: 8 апреля, 2010 - 21:33
#permalink

Я так понимаю, что в javascript в отличии от php PCRE, чтобы точка "." обозначала точку в операторе альтернативы [], её следует экранировать?


Автор: Rem (не зарегистрирован), дата: 23 апреля, 2010 - 22:19
#permalink

Вопрос по теме. Думаю, и другим будет полезен. Помогите ПОНЯТЬ.
В чате (на аяксе) есть функция замены длинных слов (многие пишут, игнорируя пробелы). Вот она:

var text = msg.replace(/(.[^\s\<\>]{15})/gi,
  "$1\n");

Работает, но.. как?
Что значат здесь знаки больше/меньше с регеспами?


Автор: Гость (не зарегистрирован), дата: 2 июня, 2010 - 02:30
#permalink

Прочто спасибо))))


Автор: mosf1k (не зарегистрирован), дата: 13 июля, 2010 - 15:33
#permalink

Подскажите, каким образом можно отлавливать все знаки препинания?
например, если нужно удалять запятые и точки из входной строки?


Автор: B@rmaley.e><e, дата: 13 июля, 2010 - 16:53
#permalink
alert( 'Запятые, и. точки. тут, совсем. не, нужны'.replace(/[,.]/g, '') );

Автор: Гость (не зарегистрирован), дата: 28 июля, 2010 - 04:23
#permalink

Есть строка состоящая из натуральных чисел, разделенная ","
надо преобразовать в массив.
Пример (работает), если мы знаем размерность массива
var a = /(\d+)[\,](\d+)[\,](\d+)[\,](\d+)/.exec("10,150,0,1230");
alert("a[0] = " + a[0]+'\n'+
"a[1] = " + a[1]+'\n'+
"a[2] = " + a[2]+'\n'+
"a[3] = " + a[3]+'\n'+
"a[4] = " + a[4]
);

Если мы не знаем размерности массива (числа натуральных строк в строке)
Пример (типа) (НЕ РАБОТАЕТ):
var a = /(\d+)[[\,](\d+)]*/.exec("10,150,0,1230,11,1234");
Можно ли обойтись без дополнительного цикла (только регулярным выражением)?



Автор: MainBuh (не зарегистрирован), дата: 30 июля, 2010 - 13:39
#permalink

А так уже нельзя var arr="10,150,0,1230,11,1234".split(',');


Автор: Гость (не зарегистрирован), дата: 31 июля, 2010 - 12:23
#permalink

Существует ли разница при работе регулярного выражения с английскими и русскими буквами?

Что-то русские буквы не ищутся..


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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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
Антиспам
9 + 7 =
Введите результат. Например, для 1+3, введите 4.
 
Новости

Открылась регистрация на мастер-классы по профессиональному Javascript, AJAX/COMET, jQuery в городах:

  • Ярославль (24-25 сентября)
  • Новосибирск (3-4 октября)
  • Казань (9-10 октября)
  • Минск (16-17 октября)
  • Днепропетровск (23-24 октября)
  • Одесса (30-31 октября)
  • Самара (13-14 ноября)

Более подробно - на странице мастер-классов.

Если вас интересует другой город - посмотрите здесь, выбрав "Другие города".

Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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

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

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