我想知道为什么在Erlang的正则表达式库re中,字符简写\s
只选择一个空格(32
ASCII字符),而不是[ \\t\\n\\r]
正则表达式的等价物。
同时,\s
-\S
(非空格字符速记)的“反模式”实现了可预测的行为。
测试实验室
- 对于
\s
的EUnit tests。 - 对于
[ \\t\\n\\r]
的EUnit tests。 - 对于
\S
的EUnit tests。
我想知道为什么在Erlang的正则表达式库re中,字符简写\s
只选择一个空格(32
ASCII字符),而不是[ \\t\\n\\r]
正则表达式的等价物。
同时,\s
-\S
(非空格字符速记)的“反模式”实现了可预测的行为。
\s
的EUnit tests。[ \\t\\n\\r]
的EUnit tests。\S
的EUnit tests。
2条答案
按热度按时间ztigrdn81#
我仍然在re库的文档中找到了问题的答案。
为了与Perl兼容,\s不用于匹配VT字符(代码11),这使得它与POSIX“space”类不同。然而,Perl在5.18版本中添加了VT,PCRE在8.34版本中也添加了VT。默认的\s字符现在是HT(9)、LF(10)、VT(11)、FF(12)、CR(十三)、空间(32),在“C”区域设置中定义为白色。如果发生区域设置特定的匹配,此列表可能会有所不同。例如,在某些区域设置中,“不间断空格”字符(\xA0)被识别为白色,而在其他情况下,VT字符则不是。
由此,我得出结论,预期的工作是可能的,所以只有当有一个设置的语言环境值-“C”。
现在我明白了为什么一切都是这样工作的--这是开发人员的构想,也就是说,我们在用Erlang实现正则表达式时需要考虑这个特性。
brjng4g32#
为了克服实现限制(与需要考虑locale值有关),我实现了一个项目,以便能够使正则表达式文本适应我的软件的可用功能(我的操作系统没有所需的locale参数集,但我希望继续使用它)。
这是一个re_tuner助手库。