Регулярные выражения
Регулярные выражения в 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' ни '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("строка") ) {
...В строке есть пробелы!...
}
Метод test начинает поиск, начиная со свойства lastIndex объекта RegExp, если оно установлено.
Метод 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 regText = "\\s"
var i = str.search(new RegExp(regText, "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".
В строке замены могут быть такие спецсимволы:
$$ |
Вставляет "$". |
$& |
Вставляет найденную подстроку. |
$` |
Вставляет часть строки, которая предшествует найденному вхождению. |
$' |
Вставляет часть строки, которая идет после найденного вхождения. |
$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);
}
В некоторых реализациях javascript регэкспы, заданные коротким синтаксисом /.../ - статичны. То есть, такой объект создается один раз в некоторых реализациях JS, например в Firefox. В Chrome все ок.
function f() {
// при многократных заходах в функцию объект один и тот же
var re = /lalala/
}
По стандарту эта возможность разрешена ES3, но запрещена ES5.
Из-за того, что lastIndex при глобальном поиске меняется, а сам объект регэкспа статичен, первый поиск увеличивает lastIndex, а последующие - продолжают искать со старого lastIndex, т.е. могут возвращать не все результаты.
При поиске всех совпадений в цикле проблем не возникает, т.к. последняя итерация (неудачная) обнуляет lastIndex.
Для общего понимания регулярных выражений можно почитать Статью в wikipedia.
Более подробно они описаны в книге (англ.) Beginning Regular Expressions.
|
\/-это косая черта?
Это косая черта "/", внутри регекспа
/.../она экранируется бэкслешем "\".Например, регексп только для косой черты выглядит вот так:
/\//\/ - значит виндетта!)
(сорри за флуд)
вЕндетта
лролролрол
Помогите пожалуйста!
В переменной str находятся несколько слов, разделённых между собой пробелом. Нужно записать в массив myArray только те из них, которые начинаются с a и заканчиваются на b. Т.е. что-то вроде:
В результате должно получиться:
Вопрос: что писать в тексте паттерна?
Если пользуетесь exec, то вам понадобится цикл, думаю лучше использовать match в вашем случае, можно например так:
var str = 'ab aa acb abc acdcdcdb'
var myRe = /\ba\w*b\b/gi
document.write(str.match(myRe))
Или ещё с таким патерном:
Извините, что постоянно повторяюсь но просто вы "изобрели столько велосипедов", а про стандартную функцию объекта String забыли!!!
var arr = 'ab aa acb abc acdcdcdb'.split(' ');
Разбей на массив эту строку, как explode в php, и потом ^a*b$
Не пойму зачем на массив разбивать? Смысл?
Ну. допустим. разбил - не фурычит! В качестве результата ничего не выдаёт.
Я с JS знаком всего-лишь немногим больше недели. Можно всё немного поподробней объяснить? Даже лучше исходник скрипта готовый выложи.
Как ты разбил? Что за вопросы насчёт "смысла" ? Тебе в итоге же массив и нужен, тогда какие оправдания чем этот способ не устаивает?
Надеюсь пробелы выкинул? Найди аналог phpшного explode, если не знаешь как правильно организовать. PHP JS тебе в лапы.
Потом в цикле for пробегаешься по массиву (не ищи в манах ссылок вида & и прочего php-дерьма, в JS массив СРАЗУ передаётся по жёсткой ссылке), если регексп не удовлетворяет - удаляешь его нахрен из массива. Вот и всё готово, в массиве останется только то что нужно. Исходник некогда ваять, время $$$.
Подскажите нубу через что можно поиск по всей странице сделать, пробовал через вариации win.document.getElementByTag('body').innerHTML не хочет
Ура научился
document.body.innerHTML помог и статья http://javascript.ru/start/dom/intro
Подскажите, почему если в примере:
...
var newString = "XXzzzz".replace(/(X*)(z*)/, replacer)
заменить строку XXzzzz на например aaaXXzzzz, то того же результата не получиться. И что нужно написать в паттерне, чтоб получить тот же результат, что и в первом случае?
Вообще, не очень понятно какой результат нужно получить, но думаю если написать вот так
var newString = "XXzzzz".replace(/.*(X*)(z*)/, replacer)
то должно помочь.
а как быть если нужно заменить расширение допустим albom/123123.jpeg jpeg на html
Как сделать просмотр назад?
?<= и ?#n не работают.
Попробуйте \\1
то же возникла такая проблема
а что значит \\1, где и как именно писать?
да и вообще, есть ли просмотр назад в 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;
• (?<= – положительное условие на предыдущие символы и отрицатель
ное условие на предыдущие символы;
• комментарий (?# и прочий расширенный синтаксис (?.
Действительно - очень обидно что нет непоглощающего поиска назад
это фундаментальная с моей точки зрения понятие.
Например, я бы не хотел бы включать в результат нахождения то, что было нужно для проверки идущего до самого нахождения, и это очень кстати при замене replace.
А вообще я хотел бы чтобы replace было не только для строки нахождения $0, но и для каждого кармана в отдельности: от $0 и до $n, т.е. чтобы кроме параметра строки замены в методе replace, были строки замены для каждого кармана.
Как я понимаю - восновном, такие задачи используются для поиска по внешним страницам, то есть открывать их придется PHP, или ему подобными. Там эти средства включены и работают на ура. А если поиск по внутренней странице - можно лучше подогнать регэксп, так как известно больше информации...
Начал эксперементировать с примером разбора "3.4.5.1"
text = "Chapter 3.4.5.1";
\d)(\.\d)?(\.\d)?(\.\d)?)/i;
regex = /chapter (?
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)?
arrRez = "Chapter 3.4.5.1".replace(/[^\d\.]/g,'').split('.');
text = "Chapter 3.4.5.1"; regex = /chapter (?:(\d)(\.\d)?(\.\d)?(\.\d)?)/i; result = text.match(regex); result[0] = ''; Log("result = " + result);[xyz] Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире
Ох, не тире, а дефис. Хотя и употребляется в смысле «тире».
народ помогите плиз составить регулярку а то немогу сделать как надо
вот приблизительно строка
Kuzyаааaj456 dfdf наградил федю
надо разделить строку на 2 части до наградил и после
при этом Kuzyаааaj456 dfdf может состоять из Nго количества слов, букв, и содержать любые символы (лат\нелат\цифры\спецсимволы)
/(.+?) наградил (.+?)/
спасибо но чет непомогло первая переменная отобразилась верно а от второй одна буква (
/^(.+?) наградил (.+?)$/
написано чтобы напомнить но никак не объяснить. Оценка 2
+1
Человеку, первый раз встречающемуся с регулярными выражениями, очень тяжело понять по этой статье, как же их надо использовать
Эта статья ни в коей мере не ставит целью научить регулярным выражениям. Скорее она для тех, кто уже знает, что такое регэкспы и изучает их работу с ними в javascript.
Для тех кто хочет научится писать хорошие популярные статьи:
1. в начале статьи приводится Аннотация ( в которой кратко приводится как содержание статьи, так и характеристика потенциальной читательской аудитории)
2. в конце статьи приводится списки использованной и рекомендуемой литературы (для рекомендуемой литературы ссылки на википедию и мануалы - не катят, хотя в использованной литературе могут быть приведены)
3. совсем шикарно, если рекомендованная (не использованная, а, именно, рекомендуемая) литература снабжена аннотацией
4. для всего списка литературы приводится язык и год издания
не могу въехать в "запоминающие скобки" (вроде, куда уж проще)
Мне нужно из страницы выбрать и запомнить определенные числа (положительные и отрицательные) . Посоветовали воспользоваться match, а числа обрамить псевдотегами. вот какой паттен в итоге получился:
но когда проверяю alert (rates); массив выдает вместе с псевдотегами (типа 1, -1)
где я ошиблась
*блин, комменты ушли
но когда проверяю alert (rates); массив выдает вместе с псевдотегами (типа
)
В результирующем массиве содержимое скобок находится начиная с индекса 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 */При использовании функции копирование в буфер - не сохраняются переводы каретки
Объясните разницу между [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));Никакой. Но не забываем экранировать, раз уж используем кавычки:
var pattern = new RegExp('^\\d{7,8}$'); ...вот еще полезный метод для оптимизации регулярных выражений RegExp.compile
Вот тут смотрю ваше руководство
Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире. Например, [abcd] - то же самое, что [a-d]. Найдет 'b' в "brisket" и 'c' в "ache".
Очень не понятно почему 'c' в "ache" . Сначала проверил а - английская (подумал что русская сначала). Потом зашел http://www.pcre.ru/eval/ и проверил там. Выдает результат поиска:
0: (a)
1: (c)
Т.е. найдет и а и c. Вопрос так почему будет c?
Задача состоит в том, чтобы проверять вводимое значении на соответствие шаблону 4 цифры/2 цифры или тоже самое без"/" (номер дома через дробь: 457/5) или просто номер дома.
У меня такое выражение:\d{1,4}\/\d{1,2}|\d{1,4}
но оно допускает и буквы и точки и прочие знаки. Подскажите, пожалуйста, как мне разрешить только цифры и косую?
вот так
/^\d{1,4}(\/\d{1,2})?$/
подскажите пожалуйста
var myRe = /(.*)\.(.*)/;
myRe.exec('el1.el2');
возвращает: el1.el2,el1,el2
el1.el2 - мне не нужно.
я догадываюсь из-за чего это происходит, но возможно ли как то сделать чтоб не проходило условие в котором есть точка?
подскажите пжз!
есть выражение replace(/(\[.*\])/gi,'xxx') которое меняет все что находится в скобках на xxx что дописать в эту часть /(\[.*\])/gi для того чтобы менялось все что в скобках и один любой символ с лева?
к примеру есть текст www-[yyy]-zzz нужно чтоб все что в скобках и знак минус был заменен -[yyy], но с лева может быть не только знак минус но и любой другой символ!
Спасибо за внимание!!!
Просто поставить точку (любой символ) перед квадратной скобкой, а именно:
Я так понимаю, что в javascript в отличии от php PCRE, чтобы точка "." обозначала точку в операторе альтернативы [], её следует экранировать?
Вопрос по теме. Думаю, и другим будет полезен. Помогите ПОНЯТЬ.
В чате (на аяксе) есть функция замены длинных слов (многие пишут, игнорируя пробелы). Вот она:
var text = msg.replace(/(.[^\s\<\>]{15})/gi, "$1\n");Работает, но.. как?
Что значат здесь знаки больше/меньше с регеспами?
Прочто спасибо))))
Подскажите, каким образом можно отлавливать все знаки препинания?
например, если нужно удалять запятые и точки из входной строки?
Есть строка состоящая из натуральных чисел, разделенная ","
надо преобразовать в массив.
Пример (работает), если мы знаем размерность массива
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");
Можно ли обойтись без дополнительного цикла (только регулярным выражением)?
А так уже нельзя var arr="10,150,0,1230,11,1234".split(',');
"10,150,0,1230".match( /\d+/g )
Существует ли разница при работе регулярного выражения с английскими и русскими буквами?
Что-то русские буквы не ищутся..
Есть.
[A-Za-z] -промежуток с латинскими буквами
[А-Яа-я] - c русскими
>Есть.
>[A-Za-z] -промежуток с латинскими буквами
>[А-Яа-я] - c русскими
Я бы сказал что с русскими так:
[а-яА-ЯёЁ]
Есть строка:
Как с помощью регулярных найти HTML теги, при этом выделить все в массив:
<html> <body> <script type="text/javascript"> var str='Питер <a href="http://a.ru">лучше, чем </a> Москва' var re = /<[^>]*>|[а-я,\s]+/gi var my_array = str.match(re) for(var i in my_array){ document.writeln('my_array[' + i + '] = \'' + my_array[i].replace(/<([^>]*)>/gi, '<$1>') + '\'<br/>') } // // my_array[0] = 'Питер ' // my_array[1] = '<a href="http://a.ru">' // my_array[2] = 'лучше, чем ' // my_array[3] = '</a>' // my_array[4] = ' Москва' // </script> </body> </html>а на вопрос "чем лучше?" мы с гордостью ответим: "чем Москва"
;-?
Клево! Мне понравилось!
Раньше я не пользовался регулярными выражениями (задач типичных для их использования не было), но вот прочитал статью и применил на работе (правда я программирую на Java:)). Статья все подробно и хорошо объясняет, спасибо!
Помогите пожалуйста найти в url один из параметров GET-запроса.
Вот такое выражение что-то ничего не находит:
find_url_menu = /(\?.*$)menu=[0-9]+\1/
Что то наподобии этого:
function my(){ var str='http://coupon.dayoffer.ru/?theme=billiard&coupon_id=VIGODA982500592&utm_source=SalesGenerator&menu=99&utm_medium=Click&utm_campaign=InShop.Ru&utm_content=Bouling'; var myRe=/^.*?\?.*?(menu=[0-9]+).*$/g; var newStr = str.replace(myRe,"$1"); alert(newStr); // menu=99 } my();str.match( /menu=\w*/g )
Имеется строка типа "\\Volume 1\test\range\12345.jpeg"
как ее преобразовать к UNIX-виду "//Volume 1/test/range.jpeg"?
\t воспринимаются как табуляция, \12 -спецсимволы и пр.
Если строка получена извне (AJAX запросом, введена пользователем, получена как свойство какого-нибудь объекта), она воспринимается как надо.
Если она в таком виде вставляется в код, то есть смысл обработать ее на сервере, либо заменив слеши одного типа на другие, либо удвоив каждый слеш.
как в regexp впихнуть переменную?
var nLastCol = 8; var str = "--,--,--,--,--,--,--,--" //(ну на самом деле это Object) if (/(--,?){8,8}/i.test(ss.getRange(ss.getLastRow(), 1, 1, nLastCol).getValues().toString())){ Browser.msgBox('TRUE'); } else {Browser.msgBox('FALSE');}вместо {8,8} надо поставить {nLastCol,nLastCol}
Как заставить это работать с русскими символами?
Как заставить это работать с русскими символами?
[А-Яа-я]
Есть строка, состоящая из составных имен, например: "Klein Stadt Prag, Praga in Bohemia". Надо удалить только те пробелы, которые идут после запятой. Почему это выражение
alert("Klein Stadt Prag, Praga in Bohemia".replace(/(?:,)\s/g, ''));удаляет и запятую, которая, вроде как, в незапоминающих скобках?
А при чем тут скобки? Удаляется все, что попало под шаблон. А запятая попадает под него.
Получается, чтобы замена работала, как я хочу, надо делать так:
alert("Klein Stadt Prag, Praga in Bohemia".replace(/,\s/g, ','));Тогда еще вопрос.
Усложняем задание, в заданной строке некоторые названия могут быть заключены в кавычки, так кавычки тоже нужно удалить.
Как более правильно:
str.replace(/'|,\s/g, function(s){ if (s==', ') return ','; return ''; }); //используем одно сложное рег. выражение и функцию для выбора вариантов заменыили
?
А вообще - все варианты равнозначны, правильнее может быть тот, что быстрее. А тут уже нужно проводить тесты.
О! Про такой вариант я не догадался.
Ну, да, варианты равнозначны. Мне, чтобы обработать лишь одно поле ввода, тесты не обязательны, можно брать любой вариант. Так что, оставим тесты тем, кому это необходимо.
B@rmaley.e><e, спасибо за советы. Автору - за статью.
вы юзаете /i, /gi и т.п., но ничего о них не пишете
вы не находите что неплохо бы добавить их описание ?
или для них здесь есть отдельная страничка ? - тогда киньте ссылку
Как сделать так, чтобы при нахождении любого символа \s или \W был возвращён ноль (ложь)
так не работает
и так тоже..
\s|\W - условие избыточное, поскольку \W уже содержит все символы из \s
flag = (msg.search(/\W/)!= -1);
должно нормально отработать
Есть строка, например - "_ха_блаблабла_хо_"
нужно получить содержимое обрамленное какими-то знаками (в данном случае - подчеркивания), без самих знаков.
делаю:
полуаю:
а мне надо:
можно ли этого добиться с помощью выражений?
попалась строка напичканая символами типа " и пробелов ) сколько уже перегуглил и переяндексил + перечитал статей и перепробовал вариантов ... ничего не выходит !!! составьте пожалуйста регу на replace для очистки всего кроме цифр и букв расположенных вместе типа хеша пример : куча пробелов - 914nm1413nm14 " и дальше куча пробелов...
заранее благодарен !!!
попробуй так:
str.replace(/\s*$/gm, ',');
надеюсь выдаст нечто близкое к твоему желаемому результату, если не совсем так что-то - думаю легко увидишь, что поправить, например запятую убрать.
function example(value) { return (/^abc$/gi).test(value); } alert(example("abc") + ", " + example("abc"));вот такая штука везде кроме фф3 выдает true, true, а в нем - true, false.
по какой-то неведомой причине фф3 считает, что при повторном вызове функции можно использовать ссылку на старый объект регулярки, а не создавать новый. если изменить конструкцию на new RegExp, то все нормально становится.
Как заставить работать со всеми буквами UTF-8?
Тут все предлагают для русских буквы использовать
[А-Яа-я]
А как быть с другими алфавитами?
В PHP это решается вот так:
preg_replace("/[^\p{L}0-9\+\-\_:\.@ ]/u", "", $_string));
\p{L} = все буквы
/u = работать с UTF-8
Как заставить JavaScript работать со всеми буквами всех алфавитов?
\w не подходит, так как вырезает все символы больше 128.
что здесь означает \\$1 и что оно делает?
у меня проболема возникла с командой test.Ввожу 100 выводит слово ERROR
var pricePattern = /^[0-9]+$^/;
var errorMessage = "";
function checkPrice(price)
{
if(!pricePattern.test(price)) {
alert("error");
errorMessage +="*" + errorPrice + "\n";
}
}
Возникла проблема:
как заменить символ "\" в строке, если после него идет символ n, то не находит.
в строке может идти любой символ после символа "\". мне нужно просто найти этот символ.
помогите пожалуйстаа
помогите плиз решить такую задачку:
мне нужно превратить абсолютный путь к файлу в относительный, то есть
var res='src="file:D:///sss/content/myimg.jpg"'.replace('тутНезнаю','src=\''content');в пути всегда есть папка "content" мне нужно отсечь все что идет до этой папки. я пробовал писать:
и еще кучу вариантов, но как-то ни какой замены не происходит.
1) Чтобы заменить символ \, нужно написать \\.
2) var res='src="file:D:///sss/content/myimg.jpg"'.replace(/.*?content\/(.*?)"/, 'src="content/$1"');
!
Только начинаю во всём разбираться!Помогите пожалуйста написать регу, которая будет искать в текстовом файле слова между словами start и end и менять их на слово mid. Очень нужно!Заранее благодарна!!!
Никак не могу решить проблему. Javascript-модуль получает RegExp извне, и строку, которую надо проверить по полученному рег.выражению.
Например, получено рег.выражение "[0-9]{5}|[0-9]{8}" и строка "102040".
Методы test и match дают неправильный результат:
strRe = "[0-9]{5}|[0-9]{8}"; src = "102040"; var re = new RegExp(strRe); var result1 = re.test(src); // возвращает true, что неверно Проверяем при помощи match var result2 = src.match(re); // тоже находит совпадения, т.к. result2.length=1Как правильно построить проверку? Добавление символов ^ и $ в начало и конец строки с рег.выражением проблему не решают.
Если ты хочешь чтобы попадали только с размером 5 или 8 то вот решение:
strRe = "^[0-9]{5}$|^[0-9]{8}$"; src = "102040"; var re = new RegExp(strRe); var result1 = re.test(src);//false var result2 = src.match(re);//nullЭто правильно, но не приемлемо для меня. Рег.выр. поступает ИЗВНЕ, и для того чтобы его изменить (разбить на составляющие по ИЛИ и в каждое поставить значки $ и ^) надо по крайней мере его распарсить.
Интересно, что в IE, если ему подсунуть XML, приблизительно такой:
и XSD схему, в которой имеется:
<xsd:element name="value"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="[0-9]{5}|[0-9]{8}"/> </xsd:restriction> </xsd:simpleType> </xsd:element>дает результат - элемент не валидный.
такой же результат дает Altova XMLSpy.
Как они работают, непонятно.
Как убрать не значищие нули в дробном числе?
Метод toFixed
Здравствуйте. есть небольшая проблемка.
есть такая строка
h_ttp://mysite.com/cat1/cat2/
как при условии что в строке нету слова cat3 выбрать все что после h_ttp://mysite.com/
и нужно сделать это только с помощью рег. выражения( сделал отдельно выбор ^h_ttp://mysite.com//(.=?.*)$
отдельно как бы условие ^((?!cat3 \.svc).)*$ при котором если есть cat3 в строке то оно выбирает только последний символ
ЗДРАВСТВУЙТЕ ВСЕМ! ПОМОГИТЕ ПОЖАЛУЙСТА!!!
Мне нужен регекс который определяет только телефонные номера, я написал такой:
var regex = /\b\(?(\d{3,6})?\)?[. -]?(\d{2,3})[. -]?(\d{2,4})?[. -]?(\d{2,4})?\b/;
но он, помимо номеров, определяет год, цены и т.д. (вобщем почти все числа). Как быть? Нужно чтобы определял только номера!
Примеры номеров: 1111 123456, 123456, 12-34-56, 123-456, 123, 1234, (111) 123-45-67
Спасибо заранее!
Интересно, а чем год будет отличаться от примеров "1234", "1111", или цена та же чем отличается от "123"? Вы с критериями отбора сначала определитесь.
Подскажите, кто может
есть скрипт, цель которого в полученной строке, например, Сайт+для+гостиничного+бизнеса заменить все плюсы на пробелы. Так вот получается заменить плюс только после первого слова. Т.е скрипт выполняется один раз. Как сделать, чтоб замена была по всей строке?
<script type="text/javascript"> var urlpage = document.URL; var urlik = getVarValueFromURL(urlpage, 'zakaz'); var decodeurlik = decodeURI(urlik) re = /\+/; str = decodeurlik; newstr = str.replace(re, " "); document.getElementById('tema').value = newstr; </script>Решил проблему, подставив в
модификатор g, позволяющий вести поиск по всей строке, т.е получается
re = /\+/<strong>g</strong>; str = decodeurlik; newstr = str.replace(re, " "); document.getElementById('tema').value = newstr;P.S в указанной строке теги strong использовать в коде не надо
Как сделать так, что бы в строке все числа( /[0-9]+/gim ) не находящиеся в скобках переносились через символ "=" и + заменялся бы на -, - на +, * на /, и / на *?
Супер!
Как вставить в шаблон регулярного выражения строку из переменной.
Например :
var str = 'TEST';
var reg = /str\/(.*)/;
Элемент массива может быть шаблоном для регулярного выражения?
И элемент массива и строка - просто подставляйте параметром в
new RegExp("....");
например к вопросу у телефонных номерах
var test = "^([0-9]{11})([\.\,\#\/][0-9]{11})?$";
var RE_SSN = new RegExp(test);
alert(RE_SSN.test())
Если элемент массива - строка, содержащая регулярное выражение, то почему бы нет:
RegExp(arr[i])
Аргументами конструктора RegExp() могут быть любые выражения возвращающие строку. Сокращённая запись выражения ( /expr/par ) в этом смысле ограничена.
В самом начале статьи нужно поменять местами примеры в этом фрагменте:
При втором вызове - т.к регулярное выражение в кавычках, то нужно дублировать \
// эквивалентны re = new RegExp("\\w+") re = /\w+/Мой мирФотоВидеоБлог
Мирослав Воеводин на ответах Просветленный (20051)
Открыт: 27 минут назад, будет выставлен на голосование через 3 дня
JavaScript!? Регулярное выражение
пример: helloworld/something_example.ref
Как регуляркой выбрать то, что идет после символа _ и до .ref
т.е. example
я делаю
var regular = /(?<=_).+?(?=.ref)/i;
в итоге получаю invalid quantifier
, пробую динамически:
var regular = new RegExp('(?<=_).+?(?=.ref)','gi');
, результат тот же, мне кажется ему 1-ое условие не нравится, так как же все-таки правильно?
народ, помогите плизз, как с ниже кода выцепить
П5-678, где ELEMENT_ID
есть такой код хтмл:
народ, помогите плизз, как с ниже кода выцепить
П5-678, где ELEMENT_ID
есть такой код хтмл:
народ, помогите плизз, как с ниже кода выцепить
П5-678, где ELEMENT_ID
есть такой код хтмл:
народ, помогите плизз, как с ниже кода выцепить
П5-678, где ELEMENT_ID
есть такой код хтмл:
Спонтанно возникла одна задачка, которую пока решить не хватает опыта, с регэкспами недавно начал знакомиться. Суть: строка состоит из значений, разделенных запятыми (как перечисление элементов массива), значения могут быть такими: [Ss] || [Ee] || [adhADH][число от 1 до 999]. Надо провести замены и получить строку с четырехзначными числами, по принципу: Ss заменяется на 4000, Ee заменяется на 9999, Aa на 3, Dd на 2, Hh на 1, все недостающие символы между [AaDdHh] и числом заменяются нулями. Собственно, в последнем и загвоздка:) Для примера, как это должно работать:
исходная строка: 's,a112,d8,h19,e,a1';
результат замен: '4000,3112,2008,1019,9999,3001'.
Заранее благодарю, если кто решит помочь:)
Формулировка "все недостающие символы" не ясна мне. Подробнее...
В формулировке задачи указано, что результатом являются четырёхзначные числа, но если в 'd8' заменить d на 2, получается '28', а надо получить '2008', т.е. - все недостающие символы между буквой и числом заменяются нулями. Иначе говоря, "вес" букв: a = 3000, d = 2000, h = 1000, и к ним надо добавить числа, идущие после них.
P.S. Сделал кое-как, в принципе работает правильно но много замен:) Если предложите вариант получше, буду очень рад:) (читает значение переменной из textarea в документе и выводит уже сконвертированный результат)
function Convert() { var converter = document.getElementById('uncoded').value; function repl(regx,str) { converter = converter.replace(regx,str); } repl(/([^0-9][0-9]{2})(?![0-9])/gim,'0$&'); repl(/(?:[^0-9])([1-9]{1})(?![0-9])/gim,'00$&'); repl(/00a/gim,'a00'); repl(/0a/gim,'a0'); repl(/00d/gim,'d00'); repl(/0d/gim,'d0'); repl(/00h/gim,'h00'); repl(/0h/gim,'h0'); repl(/s/gim,'4000'); repl(/e/gim,'9999'); repl(/a/gim,'3'); repl(/d/gim,'2'); repl(/h/gim,'1'); Write(converter,'fff','000'); }Помогите с правильностью выражения.
Необходимо проверить правильность ввода МАС адреса, если не удовлетворяет условию, то выдать какой-то результат (например false в переменную)
т.е. 6 пар символов с ограничением: цифры от 0 до 9 или лат. буквы от A до F, разделенные двоеточием.
function isValidMacAddress(macAdd) { if macAdd.length = 17 { var RegExPattern = /^([\d[A-F]{2}:){5}[\d[A-F]{2}$/; return macAdd.test(RegExPattern) } else return false; } }1) не ошибся ли я в коде ?
2) правильно ли составлен паттерн -
а то есть вот такой вариант - не знаю чем он отличается и подходит ли
/^\s*([\d[A-F]{2}:){5}[\d[A-F]{2}\s*$/
кстати критика\поправки статьи принимаются ?
Ребята, помогите - есть строка:
{"Title":"The Long Goodnight: A Film About Phil Collins","Year":"2007","Rated":"N/A","Released":"5 Sep 2007","Genre":"Documentary, Music","Director":"Anthony Mathile","Writer":"N/A","Actors":"Ronnie Caryl, Brad Cole, Phil Collins, Luis Conte","Plot":"In 2004 I came to a major decision in my life. I decided to stop my seemingly endless days of touring...","Poster":"N/A","Runtime":"1 hr 18 mins","Rating":"N/A","Votes":"N/A","ID":"tt1212426","Response":"True"}
Нужно распарсить в массив типа $str[Year] = [2007], $str[Rated] = [N/A] и т.д.
<head> <script type="text/javascript" src="jquery.js"></script>//Подключи JQuery. </head> var json = '{"Title":"The Long Goodnight: A Film About Phil Collins","Year":"2007","Rated":"N/A","Released":"5 Sep 2007","Genre":"Documentary, Music","Director":"Anthony Mathile","Writer":"N/A","Actors":"Ronnie Caryl, Brad Cole, Phil Collins, Luis Conte","Plot":"In 2004 I came to a major decision in my life. I decided to stop my seemingly endless days of touring...","Poster":"N/A","Runtime":"1 hr 18 mins","Rating":"N/A","Votes":"N/A","ID":"tt1212426","Response":"True"}'; var object = $.parseJSON(json);Вот обращение к Year.
var str = object.Year
str == '2007';
меняю местами
09 output=input.replace(/\[/g, "<")
10 output=input.replace(/\]/g, ">")
вы второй раз в исходнйо строке подменяете:
10 output=output.replace(/\]/g, ">")
Спасибо, сложно, но информативно для первого знакомства
Вопрос. Символ ` учитывается в регулярных выражениях так же как буквы/цифры/etc, или же является каким-либо спецсимволом (не упомянутым здесь, как показывает поверхностное прочтение)?
Заранее спасибо.
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.