我初学正则,常看别人的例子,有一些问题,希望大家能帮帮忙:1:去除重复的字符
str="1:2,1:3,1:4,2:3,2:5,2:6,3:1,4:3,1:2,1:4,1:6,1:2,1:2,1:3"
reg=/([\d]:[\d])([^\1]*),\1/
问题是:[^\1] 到底代表了什么字符,好像什么都能替代,我试了很多次也找不出来2:元字符在RegExp对象中的使用方法
var key= "<a href='http://bbs.test.com/read.php?tid=100'>××××××××</a></br>"
var reg2=/<a[^<>]*[^<>]*>(?:(?!<\/?a><\/br>)[\s\S])*<\/a><\/br>/gi
问题:我用这个字面量的正则可以查找替换,但我把正则定义为RegExp("....","")形式就替换不了了,我想应该是元字符的问题,但不清楚怎么修改?3:奇怪的问题
正则的目的是有12个字符并包含caat字符串的单词
var reg1=/\b(?=\w{12}\b)\w*caat\w*/gi;
var s1="abcdefgacaat";
var s2="123caatadfaf";
var s3="adsfcaatad1a";
var s4=" vdsacaata_d";
alert(reg1.test(s1));
alert(reg1.test(s2));
alert(reg1.test(s3));
alert(reg1.test(s4));
我希望用alert的方式看结果,可在字符串匹配的情况下alert方式为“true”,
“false”,“true”,“false”,请问这是什么问题?
十分感谢!

解决方案 »

  1.   

    <script type="text/javascript">
    var s = "wwc";
    alert(/(.)[^\1]/.exec(s));
    alert(/(.)(?!\1)./.exec(s));
    </script>
    这个语查不如期待。
    并且第一个。。结果也不如期待。。
    伤心中。。
      

  2.   

    alert(/(.)((\1+)|(.))/.exec(s));
    这样的取值判断下到是可以达到效果。。不过好麻烦的说。。
      

  3.   

    关于第3个问题,好象是编译的关系,
    好想只编译一次的话,第2个匹配接着第1次匹配的结果进行的,具体的还在查,忘了在哪看过了http://community.csdn.net/Expert/TopicView3.asp?id=5416975这上面的当时我也遇到这样的情况,在每次调用前在重新编译下就行var s1="abcdefgacaat";
    var s2="123caatadfaf";
    var s3="adsfcaatad1a";
    var s4=" vdsacaata_d";
    var reg1=/\b(?=\w{12}\b)\w*caat\w*/gi;
    alert(reg1.test(s1));
    var reg1=/\b(?=\w{12}\b)\w*caat\w*/gi;
    alert(reg1.test(s2));
      

  4.   

    关于第3个问题,终于搞明白了,和g与lastIndex有关,
    解决的办法还是上面的:每次调用前在重新编译下
    仔细看看下文
    http://www.chiqiang.com/logs/2006/11/3785992.html
    我把关键的地方烤下来:
    1。 假如你的正则表达式使用了"g"标记,你可以多次使用exec 方法来连续匹配相同的串。当你这样做
    的时候,新的匹配将从由正则表达式的lastIndex 属性值确定的子串中开始。(test一样的方法)2。
    RegExp的属性 在javascript 1.2, NES 3.0以上版本提供 
    描述:lastIndex 是个别的正则表达式对象的属性。 这个属性只有当正则表达式的"g"标记被使用以进行全串匹配的时候才被设置。实行以下规则:
    如果lastIndex大小字符串的长度,regexp.test和regexp.exec失败,且lastIndex被设为0。
    如果lastIndex等于字串的长度且正则表达式匹配空字符串,则正则表达式从lastIndex的位置开始匹配。
    如果lastIndex等于字符串的长度且正则表达式不匹配空字符串,则正则表达式不匹配input,且lastIndex被置为0。
    否则,lastIndex被设置成最近一次匹配的下一点。举例var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
    alert(bbb.test("aaaaaa"))
    alert(bbb.lastIndex)
    //var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi 
    alert(bbb.test("中中aa中中"))
    alert(bbb.lastIndex)
    //var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
    alert(bbb.test("aaa中aa"))
    alert(bbb.lastIndex)
    这个与上面的区别在于第2个的长度,比6大多了,可以匹配到true
    var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
    alert(bbb.test("aaaaaa"))
    alert(bbb.lastIndex)
    //var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
    alert(bbb.test("中中aa中中中中中中"))
    alert(bbb.lastIndex)
    //var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
    alert(bbb.test("aaa中aa"))
    alert(bbb.lastIndex)
      

  5.   

    将每次匹配后的lastIndex=0就等于重新编译初始化一次了之后都是true