js函数中的$1, $2, $3问题

时间:2022-09-02 07:56:31
var qq= (function(value) {
                    return value.replace(/<(\/?[a-zA-Z]+\s*)((?:"[^"]*"|'[^']*'|(?!'|"|\/?>).)*)(\/?>)/g, function (l, $1, $2, $3) {
                        return $2.replace(/([^=]+)=(?:(")[^"]*"|(')[^']*'|((?:(?!\s|'|"|\/?>).)*))/g, function (l, $1, $2, $3, $4) {
                            return $4;
                        }) ;
                    });
                })(stringValue);

①请问这里的第一个正则表达式的  l, $1, $2, $3分别是什么? 

②第二个正则表达式的  l, $1, $2, $3 ,$4又分别是什么? 

③还有,两个函数里都有l,这个值就是传入的参数stringValue值吗?

⑤另外,循环的依据是什么?就是根据什么循环的?什么时候循环开始,什么时候结束呢? 

以上五个问题,每个40分,后继加分。
谢谢大哥大姐帮忙回答一下,万分感谢!!

11 个解决方案

#1


我的乖乖,我没有看懂,帮顶!

#2


$num指第num个匹配值
匹配值指正则中的pattern也就是括号部分.

l在这里好像是多余的...

正则后的g就是循环匹配.

#4


①,②,③
function (l, $1, $2, $3)里的 l, $1, $2, $3是参数名, 用不用$num这种形式都无所谓的, 反正
第一个参数表示表示前面的正则表达式所匹配到的全部内容, 后面的参数依次表示正则里面找到的子匹配

①,②都是这个意思. 只不过第二个里面进行查找的文本, 是第一个里面查找到的第二个子匹配

⑤循环依据就是源字符串里面还有没有与模式相匹配的字符串, 如果有就继续, 直到找不到匹配为止

#5


这里只是参数名而已
document.close();
document.open();

var str = "123abc";
str = str.replace(/(.)(.)(.)/g, function(all, one, two, three) {
document.write("all:" + all + "<br/>");
document.write("one:" + one + "<br/>");
document.write("two:" + two + "<br/>");
document.write("three:" + three + "<br/>");
});


输出
all:123
one:1
two:2
three:3
all:abc
one:a
two:b
three:c


对于String.replace(rgExp, replaceFunc)方法
replaceFunc中第一参数就是正则匹配的全部内容,第二参数就是第一组匹配,第三参数就是第二组匹配。。。

#6


正则表达式用()分组,$1,$2,$3...$99对应相应的分组所匹配的值

#7


基础知识,唉,每天都有人问。 要看书阿,权威指南

#8


()扩起来的模式 

#9



var qq= (function(value) {
                    return value.replace(/ <(\/?[a-zA-Z]+\s*)((?:"[^"]*"|'[^']*'|(?!'|"|\/?>).)*)(\/?>)/g, function (l, $1, $2, $3) {
                        return $2.replace(/([^=]+)=(?:(")[^"]*"|(')[^']*'|((?:(?!\s|'|"|\/?>).)*))/g, function (l, $1, $2, $3, $4) {
                            return $4;
                        }) ;
                    });
                })(stringValue);

①请问这里的第一个正则表达式的  l, $1, $2, $3分别是什么?

②第二个正则表达式的  l, $1, $2, $3 ,$4又分别是什么? 


为何没有高手回答呢~~~~~~~
谢谢啦。

#10


学习5 楼 zswang的。
其中 function(all, one, two, three)的参数名只要是合法的(不是单纯数字之类),是什么无所谓的。
在 function (l, $1, $2, $3) 中的$1等只是参数名 不是匹配捕获的值.
function (l, $1, $2, $3) 与 function (l, $3, $2, d)是等价的.
匹配捕获的值的引用应该诸如RegExp.$1或者str.replace(regex,'$1')这样使用的.
引用 5 楼 zswang 的回复:
这里只是参数名而已
JScript codedocument.close();
document.open();varstr="123abc";
str=str.replace(/(.)(.)(.)/g,function(all, one, two, three) {
    document.write("all:"+all+"<br/>");
    document.write("one:"+one+"<br/>");
    document.write("two:"+two+"<br/>");
    document.write("three:"+three+"<br/>");
});

输出
all:123
one:1
two:2
three:3
all:abc
one:a
two:b
three:c


对于Stri…

#11


详细可参考《Javascript权威指南》(第五版)。在第699-700页,有关于replace的讲解。

#1


我的乖乖,我没有看懂,帮顶!

#2


$num指第num个匹配值
匹配值指正则中的pattern也就是括号部分.

l在这里好像是多余的...

正则后的g就是循环匹配.

#3


#4


①,②,③
function (l, $1, $2, $3)里的 l, $1, $2, $3是参数名, 用不用$num这种形式都无所谓的, 反正
第一个参数表示表示前面的正则表达式所匹配到的全部内容, 后面的参数依次表示正则里面找到的子匹配

①,②都是这个意思. 只不过第二个里面进行查找的文本, 是第一个里面查找到的第二个子匹配

⑤循环依据就是源字符串里面还有没有与模式相匹配的字符串, 如果有就继续, 直到找不到匹配为止

#5


这里只是参数名而已
document.close();
document.open();

var str = "123abc";
str = str.replace(/(.)(.)(.)/g, function(all, one, two, three) {
document.write("all:" + all + "<br/>");
document.write("one:" + one + "<br/>");
document.write("two:" + two + "<br/>");
document.write("three:" + three + "<br/>");
});


输出
all:123
one:1
two:2
three:3
all:abc
one:a
two:b
three:c


对于String.replace(rgExp, replaceFunc)方法
replaceFunc中第一参数就是正则匹配的全部内容,第二参数就是第一组匹配,第三参数就是第二组匹配。。。

#6


正则表达式用()分组,$1,$2,$3...$99对应相应的分组所匹配的值

#7


基础知识,唉,每天都有人问。 要看书阿,权威指南

#8


()扩起来的模式 

#9



var qq= (function(value) {
                    return value.replace(/ <(\/?[a-zA-Z]+\s*)((?:"[^"]*"|'[^']*'|(?!'|"|\/?>).)*)(\/?>)/g, function (l, $1, $2, $3) {
                        return $2.replace(/([^=]+)=(?:(")[^"]*"|(')[^']*'|((?:(?!\s|'|"|\/?>).)*))/g, function (l, $1, $2, $3, $4) {
                            return $4;
                        }) ;
                    });
                })(stringValue);

①请问这里的第一个正则表达式的  l, $1, $2, $3分别是什么?

②第二个正则表达式的  l, $1, $2, $3 ,$4又分别是什么? 


为何没有高手回答呢~~~~~~~
谢谢啦。

#10


学习5 楼 zswang的。
其中 function(all, one, two, three)的参数名只要是合法的(不是单纯数字之类),是什么无所谓的。
在 function (l, $1, $2, $3) 中的$1等只是参数名 不是匹配捕获的值.
function (l, $1, $2, $3) 与 function (l, $3, $2, d)是等价的.
匹配捕获的值的引用应该诸如RegExp.$1或者str.replace(regex,'$1')这样使用的.
引用 5 楼 zswang 的回复:
这里只是参数名而已
JScript codedocument.close();
document.open();varstr="123abc";
str=str.replace(/(.)(.)(.)/g,function(all, one, two, three) {
    document.write("all:"+all+"<br/>");
    document.write("one:"+one+"<br/>");
    document.write("two:"+two+"<br/>");
    document.write("three:"+three+"<br/>");
});

输出
all:123
one:1
two:2
three:3
all:abc
one:a
two:b
three:c


对于Stri…

#11


详细可参考《Javascript权威指南》(第五版)。在第699-700页,有关于replace的讲解。