关于正则,如何解释?

qingralf 2012-02-01 12:05:04
一个正则 ^|\d
他表示什么意思呢?本意是替换开头的位置和数字,但结果除了在php中正确外,java/js/python都没有出现期望的结果.
现在想弄明白.这个正则有什么错误.还有明白的人希望能通俗的解释一下.为什么java/js/python的结果是这样.

下面给出例子


alert('211'.replace(/^|\d/g,'a'));//结果为a2aa



$val = '211';
echo preg_replace('/^|\d/', 'a', $val);//结果为aaaa



import re
re.sub(r'^|\d','a','211');//结果a2aa



System.out.println("211".replaceAll("^|\\d", "a"));//结果a2aa


真的想看到为什么出现这样的结果的解释,而不是贴出另外一个正则,说这样用就可以了.这里不是要正则,只是想知道原因.
...全文
258 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqlwq123 2012-02-01
  • 打赏
  • 举报
回复
这个等高手。。。。正则表达好像分引擎的,不同的可能分析方法不同。而且LZ那个我也不知道代表什么
cstur4 2012-02-01
  • 打赏
  • 举报
回复
up 坐等
叶子 2012-02-01
  • 打赏
  • 举报
回复
\d :数字字符匹配。等效于 [0-9]

是要替换数字为a呀?
qingralf 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 txzsp 的回复:]

首字符之前和数字
[/Quote]

嗯.可结果却不是想要的.
qingralf 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gukuitian 的回复:]

java中 感觉是这样:
java.util.regex.Matcher.find()
每次成功匹配后,nextSearchIndex的值会增加(last变了);
^并不真实的存在于字符串中, 只是通过 subSequence(0,0)取的;
所以成功匹配了^开头后,索引跳过了第一个;
[/Quote]
这个和我听到的一个js的解释一样.
"因为你的正则带有g标识,相当于激活了正则的lastIndex属性值,第一次匹配时从字符串起始位置开始,因为正则/^|\d/的左分支刚好匹配字符串起始位置,于是字符串变成"a211",同时lastIndex变成1,第一次匹配结束。第二次匹配从上一次匹配的起始位置也就是lastIndex的下一位开始,即从index=2开始,这样就把index[1]也就是2跳过去了,所以最终结果就变成a2aa了。回答完毕。简单说,这个问题和正则的回溯以及lastIndex有关系"
gukuitian 2012-02-01
  • 打赏
  • 举报
回复
java中 感觉是这样:
java.util.regex.Matcher.find()
每次成功匹配后,nextSearchIndex的值会增加(last变了);
^并不真实的存在于字符串中, 只是通过 subSequence(0,0)取的;
所以成功匹配了^开头后,索引跳过了第一个;
收租的流氓汉 2012-02-01
  • 打赏
  • 举报
回复


关注中!
q107770540 2012-02-01
  • 打赏
  • 举报
回复

var replacement='a';
alert(replacement+'211'.replace(/\d/g,replacement));


q107770540 2012-02-01
  • 打赏
  • 举报
回复
恩,正则是分引擎的
不过你可以写一个都兼容的版本:

比如:


$val = '211';
echo preg_replace('/\d/', 'a', 'a'.$val);
albertshaw 2012-02-01
  • 打赏
  • 举报
回复
坐等解释...
txzsp 2012-02-01
  • 打赏
  • 举报
回复
首字符之前和数字
qingralf 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 maco_wang 的回复:]

\d :数字字符匹配。等效于 [0-9]

是要替换数字为a呀?
[/Quote]

嗯嗯.是要替换数字为a,然后行首再加一个a.
szlxq27 2012-02-01
  • 打赏
  • 举报
回复
这么多语言弄下来就完全不懂了,等高手
cstur4 2012-02-01
  • 打赏
  • 举报
回复
我也觉得是引擎的区别,应该是有些引擎行首后的一个字符与行首一起被匹配[Quote=引用 3 楼 qqlwq123 的回复:]

这个等高手。。。。正则表达好像分引擎的,不同的可能分析方法不同。而且LZ那个我也不知道代表什么
[/Quote]

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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