Регулярное выражение. Незапоминающие скобки.
Всех приветствую. Подскажите пожалуйста по поводу регулярных выражений, а конкретно по незапоминающим скобкам (?:)
Они не работают. При поиске по строке, содержимое скобок всё равно попадает в вывод. Может я что-то неправильно делаю или вообще не понимаю, подскажите кто разбирается. Пример может быть любой банальный: str = "javascript.ru/forum"; newstr = str.match(/\.(?:r)u/gi); alert(newstr); получаем на выходе .ru вместо .u //Пичаль... |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Т.е. это те же скобки, только (х) "Найденная подстрока хранится в массиве-результате поиска или в предопределенных свойствах объекта RegExp: $1, ..., $9." При использовании (?:х) "Найденная подстрока не сохраняется в массиве результатов и свойствах RegExp." Вот некая иллюстрация разницы var str = "1234567890"; var newstr = str.match(/(?:34)/gi); alert(newstr); newstr = str.match(/(34)/gi); alert(newstr); alert(str.replace(/(34)/gi,'-$1-')); alert(str.replace(/(?:34)/gi,'-$1-')); |
ksa, спасибо за ответ.
Т.е. не запоминают скобки только в массив результатов? Ведь в следующем примере алерты одинаковое значение возвращают, т.е. здесь они не действуют. var str = "1234567890"; var newstr = str.match(/(?:34)/gi); alert(newstr); newstr = str.match(/(34)/gi); alert(newstr); |
если надо
Цитата:
str = "javascript.ru/forum"; regexp = /(\.)(?:r)(u)/; newstr = str.match(regexp); alert(newstr[1]+newstr[2]); однако r незапомнилось между 1 и 2 str = "javascript.ru/forum"; regexp = /(\.)(r)(u)/; newstr = str.match(regexp); alert(newstr[1]+newstr[2]); |
рони, спасибо.
В таком случае можно и запоминающие скобки использовать, просто не выводить в результат n-й, не нужный мне элемент массива совпадений. Это тоже интересный вариант. |
Цитата:
Цитата:
В твоем примере их разницы не видно, как, например, в моем примере... Вопрос в том, что ты хочешь получить от регулярного выражения? :blink: Может уже пора перестать насиловать те скобки? :D |
Как мне показывали, в VBS незапоминающие скобки реально не запоминают:)
Нужно выделить из строки нужный кусок. Строка вида: (какое-то начало строки)(НУЖНЫЙ КУСОК)(известное условие конца куска). Сейчас мне приходится выделять (какое-то начало строки)(НУЖНЫЙ КУСОК), а потом (какое-то начало строки) реплейсить в ничто. Хотелось незапоминающих скобок и выделять нужный кусок в один проход без лишних телодвижений. И ещё, я заметил что если спользовать флаг g, то из массива результатов ничего вывести уже не получается. |
Цитата:
Цитата:
Т.е. "массив результатов и свойства RegExp" не есть "результат поиска"... Результатом поиска выступает все RegExp-выражение (исключение см.выше). |
спасибо ещё раз. прояснил для себя некоторые моменты.
|
Часовой пояс GMT +3, время: 19:40. |