源程序:
<script language="javascript">
a="{$a2$}{$a4$}";
a=a.replace(/(?<=\{\$a\d+\$)\}(?=.)/gi,"}\r\n");
alert(a);
</script>
说明:把左边是{$a数字$ 右边为不为空的任意字符"}"符号右侧加上回车符 \r\n 实现换行
显示应该是
{$a2$}
{$a4$}但是使用?<=的零宽后发断言浏览器就报错,IE7下无任何提示,firefox在错误控制台中的错误信息是
错误: invalid quantifier ?<=\{\$a\d+\$)\}(?=.)
源文件:file:///E:/EasyPHP-5.3.2/www/editer/test.html
行:26,列:12
源代码:
a=a.replace(/(?<=\{\$a\d+\$)\}(?=.)/gi,"}\r\n"); 使用零宽先行断言则无误。例如
<script language="javascript">
a="{$a2$}{$a4$}";
a=a.replace(/\}(?=.)/gi,"XX");
alert(a);
</script>
显示为{$a2$XX{$a4$} 正常 
请问?<=的零宽后发断言在js中为何报错

解决方案 »

  1.   

    a=a.replace(/(\{\$a\d+\$\})(.)/gi,"$1\r\n$2");自己测试一下
      

  2.   

    看下是不是你要的,js中的正则貌似稍微不同,用?>=会出正则语法错
    <script language="javascript">
    a="{$a2$}{$a4$}";
    a=a.replace(/\}(?=\{\$a\d+\$)/gi,"}\r\n");
    alert(a);
    </script>
      

  3.   

    正则里面的“(?”一般不能前置简单就应用的
    例如(?<=xxx)yyy这样用就有问题,并非预想的xxxyyy,写在后面就yyy(?<=xxx)就可以,是预想的yyyxxx
    具体看正则表达式的用法,这部分初学比较难理解“(?>”更加是一种特殊用法,不要凭空想象就用
    上面所说的是perl正则兼容,js实际应用应该也是一样的
      

  4.   

    to snmr_com
    如您2楼所说的正则 对于目前这个测试可以达到目的 但没有通用性 也没有用到断言 其实我的目的并非仅是把它们换行 一是检测断言的可用性 二才是字符处理
    按您4楼说的方法 依然在JS里面无法通过 这回IE7倒是报了个语法错误 FIREFOX下错误提示依然是那样。to hongmei85
    你所说的同2楼一样 可以达到目的 但我的目标是理解零宽后发断言 仅是对明明正确书写的语法却在JS中报错感到疑惑 而不是真正想要把测试字符串换行 当然其实要实现换行方法还是很多的。感谢两位 我在研究下 
      

  5.   

    用VB写了个测试的 也提示对象'Replace'的方法'IRegExp2'失败
    VB里使用正则引用的是 Microsoft VBScript Regular Expressions 5.5
    看来不是语法错误 也不是书写转义的问题
    GOOGLE了一下 正则 断言 invalid quantifier 有人同样有这样的错误没有解决 
    不知道是引擎的问题还是别的 .NET不会没有验证过。
    在等两天结贴吧
      

  6.   

    不知道你所说的通用性要达到怎样,写正则不能为了“零宽断言”而“零宽断言”像你的例子和你所要求的情况都很清晰——边界符明显、内容格式化,不必用就不用
    其实我也没在js上使用过(?<=)和(?>=),以前写js的时候(有一段时间没写js),手册上都没提到过
    我是后来写php才遇到并学习了这种写法,所以也不知道浏览器的引擎是否支持
    (js手册上有写?:和?=,但没见过?<=和?>=,所以不清楚js引擎是否支持后面两种写法)(?<=)和(?>=)一般都要用在一些通例+实例并存的情况下
    例如捕获多个相同的子串,但排除/筛选夹杂其中的某一两个如果想学习,还是找些相对复杂的例子试吧
      

  7.   

    js中不支持逆序环视的语法,也就是
    (?<=expression)
    (?<!expression)
    这两种是不支持的
    java虽然支持,但是expression中不能出现不定长度的量词,如*、+等等
    .NET中是都支持的js中支持顺序环视
    (?=expression)
    (?!expression)
    其中IE的早期版本对(?=expression)的支持不稳定,有时会得到意想不到的结果,后来有一个补丁更新中修复了,现在顺序环视这两种支持的都比较稳定了参考
    正则基础之——环视 
      

  8.   

    to snmr_com 感谢您的回复
    其实我写字符串{$a2$}{$a4$}仅是测试用 实际上是为了实现HTML代码的格式化而研究断言的。
    类似<div>文本或者自封闭HTML标签</div> 则不格式化 
    类似<div>文本<div>文本</div></div>则格式化为
    <div>
     文本
     <div>文本</div>
    </div>
    产生换行和缩进 就是这样to lxcnn 感谢您的回复 
    还是验证了不支持的说法 本以为正则是独立于编程语言之外的 难道JS的不支持仅是因为解释型语言。但是VB里面也没有通过检测,就不好这么说了。回头PHP里面实验一下,服务端的代码因该和浏览器没有太大关系。
    至于JAVA和.NET 本人都没有学习和使用过 但按你说的expression中不能出现不定长度的量词,如*、+,感觉其实也是有一定限制,我会看下你给我的资料 谢谢。
      

  9.   

    to lxcnn  看过你写的 正则基础之——环视 受益匪浅!搞明白了。结贴。