正则表达式错误:指定了太多的多字节代码范围

时间:2011-07-03 14:41:30

标签: ruby regex utf-8 character-encoding ruby-1.9

我有一个需要匹配一堆字符的正则表达式。代码没有问题是ruby 1.8.7,但在1.9中它会杀死它。我想这与编码有关,我已经做了很多谷歌搜索,所以也许有人可以启发我。

代码:

# encoding: utf-8
non_latin_hashtag_chars = [
  (0xA960..0xA97F).to_a, # Hangul Jamo Extended-A
  (0xAC00..0xD7AF).to_a, # Hangul Syllables
  (0xD7B0..0xD7FF).to_a  # Hangul Jamo Extended-B
].flatten.pack('U*').freeze

e = /[a-z_#{non_latin_hashtag_chars}]/io

错误:

~/Desktop: ruby regex_test.rb 
regex_test.rb:13:in `<main>': too many multibyte code ranges are specified: /[a-z_가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍......

2 个答案:

答案 0 :(得分:7)

正如twehad所指出的,正则表达式有10k的限制。

在任何情况下,您都应该在Regexp中使用unicode范围:

/[a-z_\uA960-\uA97F\uAC00-\uD7AF\uD7B0-\uD7FF]/io

我不是韩语专家所以我不知道它是否相同,但如果你想匹配所有韩文字符,你应该使用该类代替:

/[a-z_\p{Hangul}]/io

答案 1 :(得分:4)

这是正则表达式中的10000多字节сhar限制。

您需要更改ONIG_MAX_MULTI_BYTE_RANGES_NUM配置参数(/ruby-1.9.2-p*/include/ruby/oniguruma.h):

#define ONIG_MAX_MULTI_BYTE_RANGES_NUM     10000

然后重新编译ruby。