[abc] 表示匹配abc这三个字符当中的任意一个;
[^abc] 表示匹配abc这三个字符之外的其它字符;
a|b 表示匹配a或者b;
我来请教大家:
[^a]|[b]
应该会匹配什么呢?
[d]|[^d]
又应该匹配些什么呢?
请大家先不要测试,直接写出答案,然后再把测试之后的结果也写出来。大家分析一下,这是不是一个Bug呢?
其实我这个问题是因为,我想匹配除了“符号”和“空白字符”之外的所有字符,但是同时允许匹配下划线"_"(这个也属于字符),因此我不得不这么写:
[_]|[^\s\p{S}\p{P}]
结果却发现完全不是这么一回事,我觉得这个实际的匹配情况不符合逻辑,好像是一个Bug。当然,上面那一个例子也许应该写成:
[_\S\P{S}\P{P}]
这样更加正确。
(顺便透露一下,上次那个1725字符的表达式,先经过几次缩减变成14xx,然后再经过几次迅速膨胀,现在变成3xxx了,估计还要稍微小胀一点点。这个用于分析词法的正则表达式已经差不多构造好了,虽然似乎没有人用正则表达式匹配来分析词法的(基本上用DFA的比较多),不过我觉得用Regex也不是完全不可能的,就让我来证明一下吧。)