问一个正则表达式的问题

yaojiank 2010-06-17 11:46:39
regex: [[aa]]
目标串: a[]

为什么结果匹配为:[]
...全文
117 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
luozhangwen 2010-06-18
  • 打赏
  • 举报
回复
过客是正则砖家啊
兔子-顾问 2010-06-18
  • 打赏
  • 举报
回复
恩。记住了。
谢谢客客师傅。
-过客- 2010-06-18
  • 打赏
  • 举报
回复
在.NET中,不构成歧义的情况下,“[”和“]”可以不用转义,程序也可以得到预期结果,但是这种写法可读性较差,而且出现错误时不易排查,因此不推荐这种写法

举例:Regex reg = new Regex("[^]]+"); //不推荐

.NET的字符组中支持集合减法,语法[set1-[set2]],例如[a-z-[aeiou]]表示除元音外的小写字母。但是除非你很了解这种语法的支持范围,以及确实有必要这样做,否则不要轻易使用这种可读性较差的语法。事实上完全可以用多个范围区间[b-df-hj-np-tv-z],在区间较多,导致可读性差、容易出错的情况下,可以使用正向预搜索来实现以上需求,(?![aeiou])[a-z],这种语法规则,支持范围要大得多,可读性也要好一些。

其实在任何语言中,无论是否支持字符组嵌套或是自动转义处理,都不推荐直接嵌套使用,如确实有必要在字符组中出现“[”和“]”时,一定要做转义处理
兔子-顾问 2010-06-18
  • 打赏
  • 举报
回复
学习了。原来如此。.net下我只知道[]中间的[]需要转义,还真没想过嵌套使用。
-过客- 2010-06-18
  • 打赏
  • 举报
回复
不是所有的语言都支持字符组[]的嵌套的,我所了解的语言中,目前只有。NET支持
JavaScript中既然不支持,那么对[[aa]]的解释自然就不是“[”、“]”、“a”三个字符中的任意一个了
此时应该是
[[aa]]
也就是第一个“[”和第一个“]”组成字符组,最后一个“]”只是普通字符“]”而已
此时由前面的字符组“[[aa]”也就相当于“[\[a]”来匹配字符“[”,由最后的“]”来匹配字符“]”
<script type="text/javascript"> 
var test = "a[]";
var reg = /[[aa]]/;
document.write(test.match(reg));
</script>
/*-------输出-------
[]
*/


将第二个“]”转义,此时就是一个字符组了
[[aa\]]
看一下输出
<script type="text/javascript"> 
var test = "a[]";
var reg = /[[aa\]]/;
document.write(test.match(reg));
</script>
/*-------输出-------
a
*/


这种正则,也仅仅是在学习研究时出现,实际应用中绝不允许出现
容易得到无法预期的结果,也难以维护

87,992

社区成员

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

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