Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение, из учебника. Ни как не могу понять (https://javascript.ru/forum/misc/55017-regulyarnoe-vyrazhenie-iz-uchebnika-ni-kak-ne-mogu-ponyat.html)

emptinessandform 10.04.2015 10:22

Регулярное выражение, из учебника. Ни как не могу понять
 
// регэксп для пары атрибут=значение
var attr = /(\s*\w+=(\w+|"[^"]*")\s*)/

// используем его внутри регэкспа для тега
var reg = new RegExp('<\\w+(?=(' + attr.source + '*))\\1>', 'g');

var good = '...<a test="<>" href="#">... <b>...';

var bad = "<tag a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b\
  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b";

alert( good.match(reg) ); // <a test="<>" href="#">, <b>
alert( bad.match(reg) ); // null (нет результатов, быстро)


в этом выражении мне вроде бы все понятно, но я не уверен.
<\\w+(?=(' + attr.source + '*))\\1>

первая часть выражения <\\w+(?=(' + attr.source + '*))\\1>
сработает только если внутренняя скобка найдет любое выражение подходящее под attr.source?

ну вот сработало, а потом, что произойдет?
<\\w+(?=(' + attr.source + '*))\\1> //1 просто вставит запомненное?

рони 10.04.2015 12:23

emptinessandform,
не знаю что делает \1 - может кто пояснит, но я бы предложил такой вариант, найдёт больше тегов чем, вариант из учебника.
var reg = new RegExp('<(((["\'])[^"\']*\\3)|[^>])*?>', 'g');//ищет либо не > или что-то в любых кавычках 'test' 
var good = '...<a test="<>" href="#" >... <b>...';
var bad = "<tag a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b\
  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b  a=b";

alert( good.match(reg) ); // <a test="<>" href="#">, <b>
alert( bad.match(reg) ); // null (нет результатов, быстро)

ruslan_mart 10.04.2015 12:50

Цитата:

Сообщение от рони
\1

\n - Регулярка из скобок, где n - номер скобок.

([a-z]+)(\1) -> ([a-z]+)([a-z]+)

рони 10.04.2015 13:21

Цитата:

Сообщение от Ruslan_xDD
n - номер скобок.

ты можешь обьснить что делает \1 в примере из учебника -- в моём примере \3 ищет вторую кавычку -- зачем нужно \1 я не знаю, но без этого конечно не работает.

рони 10.04.2015 18:48

theKingOfJava,
ок


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