为什么这个正则表达式在 #ruby 中工作正常,却在 #jruby 中不起作用?
<Symbol>: /^[\p{Symbol}]+$/
错误“字符属性名称无效”
Regexp
库,这是 YARV和Rubinius 使用的 Onigmo
Regexp
库 的手写逐行 C 到 Java 端口。
其实,故事并没有那么简单。
首先,有一个名为
Oniguruma的
Regexp
图书馆。然后将该库导入到 YARV 源代码树中,从而有效地分叉。 YARV 开发人员向他们自己的分支添加了功能,其中一些被合并回 Oniguruma 本身,一些则没有。 Oniguruma 开发人员添加了功能,其中一些已合并到 YARV 分支中,有些则没有。
在那段时间的某个时刻,JRuby 开发人员放弃了在 Java 正则表达式之上支持 Ruby 语义的尝试,而是将 Oniguruma 从 C 逐行转换为 Java。由此产生的库称为 Joni。当然,Oniguruma 及其 YARV 分支仍在继续开发,Joni 开发人员必须尝试并跟踪该开发。
快进几年,Oniguruma 的另一个分支被创建,称为 Onigmo,它分支了 Oniguruma 的最新版本,并添加了 YARV 开发人员添加的许多功能。 YARV 开发者抛弃了他们自己的 Oniguruma 分支,转而导入他们自己的 Onigmo 分支。
乔尼必须努力跟上这一切。
简而言之:这可能是一个错误:有时,在某个地方,某些东西丢失了,翻译错误了,或者只是简单的错误。它发生了。
您应该针对 JRuby 或 Joni 或两者都提交错误。
只是快速补充一下,因为 Jorg 拼写得很好......
因为 Onigmo 除了作为 CRuby 的一部分之外并不真正存在,因此请针对 JRuby 提交您的问题 (http://bugs.jruby.org)。将问题演示为 JRuby bug 会更容易。我们将在 JRuby(对于与 CRuby 中的非 Onigmo 代码对应的代码)或 JCodings(对于属于 Onigmo 的代码)中修复它。
现在可以了:)
stackoverflow-34864702.rb
#<Symbol>: /^[\p{Symbol}]+$/
re = /^[\p{Symbol}]+$/
p re.to_s
$ ruby -v stackoverflow-34864702.rb
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.x86_64-darwin22]
"(?-mix:^[\\p{Symbol}]+$)"
$ jruby -v stackoverflow-34864702.rb
jruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21.0.1+12-LTS on 21.0.1+12-LTS +jit [x86_64-darwin]
"(?-mix:^[\\p{Symbol}]+$)"