SUMTEC -- There's a thing in my bloglet.

But it's not only one. It's many. It's the same as other things but it exactly likes nothing else...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  263 随笔 :: 19 文章 :: 3009 评论 :: 74万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

[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也不是完全不可能的,就让我来证明一下吧。)

posted on   Sumtec  阅读(1155)  评论(7编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示