Ruby 1.8 регулярное выражение: индекс совпадения в строке utf - PullRequest
0 голосов
/ 21 апреля 2010

Я пытаюсь найти текст на соответствие и вернуть его с фрагментом вокруг него. Для этого я хочу найти соответствие с регулярным выражением, а затем вырезать строку, используя индекс соответствия + - радиус фрагмента (text.mb_chars [start..finish]).

Однако я не могу заставить регулярное выражение ruby ​​(1.8) возвращать индекс соответствия, который был бы многобайтовым.

Я понимаю, что регулярное выражение - это одно место в 1.8, которое должно быть осведомлено, но, похоже, оно не работает, несмотря на переключатель / u:

"Résumé" =~ /s/u
=> 3

"Resume" =~ /s/u
=> 2

Результат должен быть таким же, если регулярное выражение действительно работало в многобайтовых (/ u), но возвращает байтовый индекс.

Как получить индекс соответствия в символах, а не в байтах?

Или, может быть, есть какой-то другой способ получить фрагмент во время (каждого) матча?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2011

Как насчет использования этой функции jindex, которую я написал, которая соответствует другим методам в библиотеке jcode:

class String
  def jslice *args
    split(//)[*args].join rescue ""
  end
  def jindex match, start=0
    if match.is_a? String
      match = Regexp.new(Regexp.escape(match))
    end
    if self.jslice(start..-1) =~ match
      $PREMATCH.jlength + start
    else
      nil
    end
  end
end
0 голосов
/ 21 апреля 2010

Не настоящий ответ, но слишком длинный для комментария.

код

print "Résumé" =~ /s/u
print "\n"
print "Resume" =~ /s/u

в Windows (Ruby 1.8.6, выпуск 26.) печатает:

2
2

И в Linux (ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]) печатается:

3
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...