【发布时间】:2021-09-26 07:34:45
【问题描述】:
我想知道为什么在 Erlang 的正则表达式库 re 中,字符简写 \s 只选择一个空格(32 ASCII 字符),而不是 [ \\t\\n\\r] 正则表达式的等价物。
同时,\s - \S(非空格字符简写)的“反模式”实现了可预测的行为。
测试实验室
-
EUnit tests 为
\s。 -
EUnit tests 为
[ \\t\\n\\r]。 -
EUnit tests 为
\S。
【问题讨论】:
-
从未使用过,但第一个链接中的文档说 “为了与 Perl 兼容,\s 不用于匹配 VT 字符(代码 11),这使得它不同于POSIX "space" 类。然而,Perl 在 5.18 版本中添加了 VT,PCRE 在 8.34 版本中跟进。默认的 \s 字符现在是 HT (9), LF (10), VT (11), FF (12), CR (13) 和空格 (32),它们在“C”语言环境中被定义为空格。” 您是说您遇到的行为与文档中提到的内容相矛盾吗?
-
是的。原来如此。我已经通过测试验证了这一点。
-
我目前正在测试 Erlang re 库的工作,阅读文档并分享我的发现。如果有人,一个更有经验的 Erlang 程序员,能告诉我们一些有价值的东西——为什么会这样,我会很高兴。
-
我回到 Erlang/OTP R14B04 并运行了您的
tests_09_whitespace_01_tests:research_test/0函数,该函数针对所有值 0-255 测试\s,并针对该 OTP 版本和此后的每个主要版本,它打印出找到 9、10、12、13 和 32,然后从版本 20.0 开始,它还包含 11 作为匹配项。这与 @41686d6564 的文档和评论相匹配。我在我的环境中设置了LC_ALL=C。我建议检查您的语言环境设置。 -
@SteveVinoski,谢谢你的线索!我用 Erlang/OTP 24 运行测试。我检查了我的语言环境。
LC_ALL未设置。应该在变量LC_ALL中设置什么值才能获得文档中声明的值并使用 Unicode?从re 库的开发人员的角度来看,我非常希望有正确的系统设置。