Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярные выражения - получение только группы с захватом (https://javascript.ru/forum/misc/28753-regulyarnye-vyrazheniya-poluchenie-tolko-gruppy-s-zakhvatom.html)

RUVATA 01.06.2012 15:06

Регулярные выражения - получение только группы с захватом
 
Всем доброго времени суток...
Помогите разобраться с регулярными выражениями в JavaScript,
в общей терминологии регулярок существует такой термин как
"группа с захватом" как правило это круглые скобки "()", JavaScript судя по всему не исключение, но я никак не пойму как ограничить выборку именно этой самой группой с захватом, т.к. она вроде как и предназначена именно для этого. Читал, читал и вычитал, что вроде как многократный вызов *.exec решает эту головоломку... или я чего-то не понимаю, - или ничего он не решает.
Имеем мы следующее.
пусть мы поставили перед собой тривиальную задачу выдергивания чего либо МЕЖДУ (чаще всего показывают на примере извлечения содержимого тегов, давайте и мы поиграемся)
исходный текст:
Код:

<some>sdgsdgsd</some>\n<some>12312412</some>
все казалось бы проще простого
var result;
var text = "<some>sdgsdgsd</some>\n</some>12312412</some>"
var pattern =  /<some>(.*?)<\/some>/g

while ( (result = pattern.exec(text)) != null) {
  alert("Найдено " + result[0] + ":  ("+ result[1]+") и ("+result[2]+")")
  alert("Дальше ищу с позиции "+result.lastIndex)	
}

на выходе получаем что exec нашел полное совпадение, и ограниченное группой с захватом, итого ДВА (мне не надо ДВА, мне надо то что я обозначил группой с захватом!), более того дальше он не пошел, и самоудовлетворился отискав "<some>sdgsdgsd</some>" и "sdgsdgsd"
Код:

result[0] = "<some>sdgsdgsd</some>"
result[1] = "sdgsdgsd"
result[2] = 'undefined'
result.lastIndex = 21

ПОЧЕМУ ?!

Deff 01.06.2012 15:15

var pattern = /<some>([^<]*)<\/some>/gm

GuardCat 01.06.2012 15:27

RUVATA, вот здесь похожая тема.

Dim@ 01.06.2012 15:30

Если я правильно понял вам надо вытянуть текст из тегов (ваша эта задачка), я обычно это решаю методом объекта string - строка.match(Регулярка) :) я бы так это решил
var text = "<some>sdgsdgsd</some>\n<some>12312412</some>"
var pattern =  /<some>(.*)<\/some>/img;
if(pattern.test(text)==true) {
text2 = text.match(pattern);
i = text2.length;
for(k=0;k<i;k++){
text2[k]=text2[k].replace(/((<\/some>)|(<some>))/img,'')
alert("Найдено " + text2[k])
  }}

weqq 04.06.2012 16:24

У вас действительно так:
var text = "<some>sdgsdgsd</some>\n</some>12312412</some>"

?!

<some>sdgsdgsd</some>
- подходит.
</some>12312412</some>
- НЕ подходит..

Dim@ 12.06.2012 15:44

weqq,
нет вот ваша строка
var text = "<some>sdgsdgsd</some>\n</some>12312412</some>"

а вот моя (я просто хотел показать как находит и изменил </some> на <some>)
var text = "<some>sdgsdgsd</some>\n<some>12312412</some>"


Часовой пояс GMT +3, время: 13:12.