ошибка регулярного выражения (Java :: JavaLang :: ArrayIndexOutOfBoundsException: 4) для 3-символьных неанглийских строк - PullRequest
0 голосов
/ 31 марта 2011

Следующие шаги воспроизводят ошибку.Какие-нибудь обходные пути / исправления?Благодарю.Также это происходит с

jruby 1.5.2 / rails 2.3.9 и jruby 1.6 / rails 3.0.5

regex = /(aaa|bbb):/
str = "\343\202\242:"
str =~ regex

Шаги в действии.

d:\myapp>jruby script/rails console
Loading development environment (Rails 3.0.5)
irb(main):001:0> regex = /(aaa|bbb):/
=> /(aaa|bbb):/
irb(main):002:0> str = "\343\202\242:"
=> "péó:"
irb(main):003:0> str =~ regex
Java::JavaLang::ArrayIndexOutOfBoundsException: 4
        from org.jcodings.MultiByteEncoding.safeLengthForUptoFour(MultiByteEncoding.java:5
        from org.jcodings.specific.NonStrictUTF8Encoding.length(NonStrictUTF8Encoding.java
        from org.joni.Matcher.forwardSearchRange(Matcher.java:124)
        from org.joni.Matcher.search(Matcher.java:432)
        from org.jruby.RubyRegexp.search(RubyRegexp.java:1474)
        from org.jruby.RubyRegexp.op_match(RubyRegexp.java:1391)
        from org.jruby.RubyString.op_match(RubyString.java:1557)
        from org.jruby.RubyString$i$1$0$op_match.call(RubyString$i$1$0$op_match.gen:65535)
        from org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:
        from org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:139)
        from org.jruby.ast.CallOneArgNode.interpret(CallOneArgNode.java:57)
        from org.jruby.ast.NewlineNode.interpret(NewlineNode.java:103)
        from org.jruby.ast.RootNode.interpret(RootNode.java:129)
        from org.jruby.evaluator.ASTInterpreter.INTERPRET_EVAL(ASTInterpreter.java:95)
        from org.jruby.evaluator.ASTInterpreter.evalWithBinding(ASTInterpreter.java:160)
        from org.jruby.RubyKernel.evalCommon(RubyKernel.java:1134)
... 158 levels...
        from org.jruby.RubyKernel$s$1$0$require.call(RubyKernel$s$1$0$require.gen:65535)
        from org.jruby.internal.runtime.methods.JavaMethod$JavaMethodOneOrNBlock.call(Java
        from org.jruby.internal.runtime.methods.AliasMethod.call(AliasMethod.java:61)
        from org.jruby.internal.runtime.methods.AliasMethod.call(AliasMethod.java:61)
        from org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:
        from org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:139)
        from script.rails.__file__(script/rails:6)
        from script.rails.load(script/rails)
        from org.jruby.Ruby.runScript(Ruby.java:670)
        from org.jruby.Ruby.runNormally(Ruby.java:574)
        from org.jruby.Ruby.runFromMain(Ruby.java:423)
        from org.jruby.Main.doRunFromMain(Main.java:278)
        from org.jruby.Main.internalRun(Main.java:198)
        from org.jruby.Main.run(Main.java:164)
        from org.jruby.Main.run(Main.java:148)
        from org.jruby.Main.main(Main.java:128)irb(main):004:0>

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

Я думаю, что поскольку вы передаете строку, содержащую многобайтовые символы, вам необходимо передать параметр регулярного выражения / u, чтобы проанализировать его как строку UTF-8.

Только что проверил это в разных версиях Ruby, и это, кажется, происходит только в JRuby, поэтому я думаю, что вы нашли ошибку;)

Если вы сначала используете что-то вроде «string» .to_java_stringКазалось бы, это работает, но на самом деле он сначала конвертирует его в ISO-8859-1, что вам не нужно.Чтобы сохранить кодировку, просто используйте .to_java и передайте ей регулярное выражение.

Вот обходной путь, который должен работать, я думаю:

regex = /(aaa|bbb):/u
str = "\343\202\242:"
str.to_java =~ regex
0 голосов
/ 31 марта 2011

Возможно, регулярное выражение не разделено.Как насчетstr = ~ / (aaa | bbb): /

илирегулярное выражение = '(ааа | ГЭБ):'str = ~ / regex /

...