刚刚写正则表达式,又犯了个小错,想想中间相隔时间一长,每次写正则的时候都会被各种小问题坑一把,所以决定被坑一次记录一次。
今天的小问题所是()和[]
我想写一个或的表达式,用来判断是否是这几个词语中的一个。于是一开始用[ ],发现结果都是一些单个的字被匹配。当时脑子抽了,就没往括号上想,以为是里面的每个词语都需要被括起来,发现没用。
[震惊|愤怒|悲伤|感动|喜悦|幸福|无聊|可笑]
把最外面的[]改称()就可以了。
(震惊|愤怒|悲伤|感动|喜悦|幸福|无聊|可笑)
想想看之所以手贱犯了这样错误,并且没有在第一时间反应过来,还是没iyou理解[]的意义。
所谓方括号,意思是这里面的所有各自字符构成的集合。如[abcd]就是一个字母,它将从一个集合{a,b,c,d}中取出。
所以[ab|cd|ef]的意思是有这样的一个4元素集合{a,b或者c,d或者e,f},然后在里面取一个元素
如果我加上括号,[[ab]|[cd]|[ef]]其实是一个只有一个元素的集合{(a或者b)或者(c或者d)或者(e或者f)}也就是{a或者b或者c或者d或者e或者f},但事实是这样吗?不是当[]存在[],且用|符号连接时,最后一个|的后面的整个部分会被忽略,即使最后的这部分本身没有[]。是不是很绕?但是我也没有想好解释的方法,姑且当作一个规律先记住吧。有谁知道原因请在评注里指点,谢谢。
我将我测试的例子留在这里:
例子1:
测试文本
ab ef gh cd
正则表达式
[[ab]|[cd]|[ef]|[gh]]
或
[[ab]|[cd]|[ef]|gh]
结果都是:
共找到6处匹配: a b e f c d
例子2:
测试文本
ab ef gh cd
正则表达式
[ab|cd|ef|gh]
结果都是:
共找到8处匹配: a b e f g h c d
最后正确的例子也给出:
正则表达式
(ab|cd|ef|gh)
结果都是:
共找到4处匹配: ab ef gh cd
谁能帮我解释一下例子1的原因!!!!!!谢谢!!!
原文链接:https://www.f2er.com/regex/360512.html