关于正则的奇怪问题

ttyp 2004-10-13 05:20:17
<SCRIPT LANGUAGE="JavaScript">
<!--
var str ="<html><body>sdfsd</body></html>"

var re = /\<(.*?)\>(.*?)\<\/\1\>/gim;

var t = str;
while(re.test(t))
{
t = t.replace(re,"$2") +"";
// re.test(t);
// alert(t);
}

alert(t);

//-->
</SCRIPT>

//以上去掉注释,则正常,没搞懂啊
...全文
147 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttyp 2004-10-14
  • 打赏
  • 举报
回复
原文:http://dev.csdn.net/Develop/article/32/article/33/33818.shtm
ttyp 2004-10-14
  • 打赏
  • 举报
回复
属性
注意RegExp对象的几个属性既有长名字又有短名字(象Perl)。这些名字都是指向相同的值。Perl是
一种编程语言,而Javascript模仿了它的正则表达式。

属性$1, ..., $9
取得匹配的子串,如果有的话

属性$_
参考input

属性$*
参考multiline

属性$&
参考lastMatch

属性$+
参考lastParen

属性$`
参考leftContext

属性$'
参考rightContext

属性constructor
指定用来建立对象原型函

属性global
决定是否测试正则表达式是否不能匹配所有的字符串,或者只是与最先的冲突。

属性ignoreCase
决定试图匹配字符串的时候是否忽略大小写

属性input
当正则表达式被匹配的时候,为相反的字符串。

属性lastIndex
决定下一次匹配从那里开始

属性lastMatch
最后一个匹配的字符

属性lastParen
子串匹配的时候,最后一个parenthesized,如果有的话。

属性leftContext
最近一次匹配前的子串。

属性multiline
是否在串的多行中搜索。

属性prototype
允许附加属性到所有的对象

属性rightContext
最近一次匹配后的的子串。

属性source
模式文本





方法
compile方法
编译一个正则表达式对象

exec方法
运行正则表达式匹配

test方法
测试正则达式匹配

toSource方法
返回一个对象的文字描述指定的对象;你可以使用这个值来建立一个新的对象。不考虑Object.toS
ource方法。

toString方法
返回一个字符串描述指定的对象,不考虑Object.toString对象。

valueOf方法
返回指定对角的原始值。不考虑Object.valueOf方法。

 另外,这个对象继承了对象的watch和unwatch方法


ttyp 2004-10-14
  • 打赏
  • 举报
回复
看错了,呵呵,感谢saucer(思归)等的解答
saucer 2004-10-14
  • 打赏
  • 举报
回复
>>>,还有个疑问,为什么t = t.replace(re,"$2") +"";之后,t的值没有立即改变?

不懂你的意思,再检查一下,值应该是变的

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/reconbackreferences.asp

如果你能找到,下书是市面上有关正则表达式最好的书籍
http://www.oreilly.com/catalog/regex2/
blues-star 2004-10-14
  • 打赏
  • 举报
回复
凡是讲正则式的都会讲g i m,仔细找找。
ttyp 2004-10-14
  • 打赏
  • 举报
回复
谢谢了,还有个疑问,为什么t = t.replace(re,"$2") +"";之后,t的值没有立即改变?哪里有/g等参数的介绍啊,手头几本正则的教程里都没有
saucer 2004-10-14
  • 打赏
  • 举报
回复
because you are using /g flag, i.e., global matching, after the first successful match, if you changed the string, the next match will return false, then the next match will re-start again, just try


<SCRIPT LANGUAGE="JavaScript">
<!--
var str ="<html><body>sdfsd</body></html><d>xxx</d>"

var re = /(\<(.*?)\>(.*?)\<\/\2\>)/gim;

var t = str;
alert("before the replacement:\n" + t);
while(re.test(t))
{
alert(RegExp.$1);
t = "<x>ss</x>";
//re.test(t);

}

alert("after the replacement:\n" + t);

//-->
</SCRIPT>


so for what you want, remove the /g flag, i.e.,


<SCRIPT LANGUAGE="JavaScript">
<!--
var str ="<html><body>sdfsd</body></html><d>xx</d>"

var re = /\<(.*?)\>(.*?)\<\/\1\>/im;

var t = str;
while(re.test(t))
{
t = t.replace(re,"$2") +"";
alert(t);
// re.test(t);
// alert(t);
}

alert(t);

//-->
</SCRIPT>
cybernaute 2004-10-13
  • 打赏
  • 举报
回复
第一次匹配<html>...</html>
第二次匹配<body>...</body>

不知道是不是你想要的
是是非非 2004-10-13
  • 打赏
  • 举报
回复
<SCRIPT LANGUAGE="JavaScript">
<!--
var str ="<html><body>sdfsd</body></html>"

var re = /\<(.*)\>(.*)\<\/\1\>/gim;

var t = str;
do
{
t=t.replace(re,"$2");
re.test(t);
// alert(t);
}while(re.test(t))

alert(t);

//-->
</SCRIPT>

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧