Извлечь с помощью регулярных выражений - PullRequest
1 голос
/ 30 марта 2012

Я новичок в Ruby, Regex и Stackoverflow. xD Вот моя проблема:

Я хочу использовать регулярные выражения для извлечения фраз, состоящих из последовательных слов со стандартными символами ASCII, помимо других во вьетнамских текстах.

Другими словами, фразы, содержащие только \ w символов, например:

Меньше, чем острее, то есть (больше, чем когда-либо). pác nói mình â € œy phê lòi mắt rồi). Cac bạn cho mình hỏi 1 câu (cac Бен Чен Минь Нгу Нхе Нгхип Миньх): Цей Май Най Чим Санг Анх Ден Монг Vodafone Là Dùng Vô tư ах? Nùu dùng được bên Anh mà không phải chọc ngoáy j the mình mua mtt cai

Меня не волнует его значение, я хочу получить массив хешей, содержащий результаты с двумя парами: value => значение извлеченных фраз , начальная_позиция => позиция первого символа .

Согласно примеру примерно, это должно быть так: [{: value => "con Sharp",: начальная_позиция => 16}, {: значение => "бао ч",: начальная_позиция => бла-бла} ...]

Это означает, что все слова, содержащие \ W символов, такие как "mình", "rất", "thích" и т. Д., Отклоняются.

Попробуйте приведенный выше пример с этим регулярным выражением на rubular.com для Ruby 1.9.2 :

\ Ь [\ ш | \ s] + \ б

Я почти получил нужные фразы (кроме пробелов), но, похоже, он не работает на моем Ruby, который тоже 1.9.2p290, с использованием 64-битной Win 7.

Любые идеи будут высоко оценены. Заранее спасибо.

1 Ответ

1 голос
/ 30 марта 2012

Согласно Rubular, похоже, что \w соответствует всем буквам и цифрам ascii (и подчеркнуты), но \b работает хорошо для всех букв Unicode.Это немного сбивает с толку.

Однако вам нужны все последовательности слов ASCII.Это должно соответствовать им:

/\b[a-z]+\b(?:\s+[a-z]+)*\b/i

Рабочий пример: http://www.rubular.com/r/1iewl7MpJe

Краткое объяснение:

  • \b[a-z]+\b - первое слово ASCII.
  • (?:\s+[a-z]+) - любое количество пробелов и слов - по крайней мере один пробел и одна буква каждый раз.
  • \b - чтобы последнее слово не заканчивалось в середине другого слова,как n в "con Sharp này".

Я не уверен в получении хэша, но вы можете получить все MatchData s, аналогично:
Как получить данные о совпадении для всех вхождений регулярного выражения Ruby в строке?

s = "hello !@# world how a9e you"
r = /\b[a-z]+\b(?:\s+[a-z]+)*\b/i

matches = s.to_enum(:scan, r).map { Regexp.last_match }
           .map {|match| [match.to_s(), match.begin(0)]}
puts matches 

Вот пример для ideone: http://ideone.com/YRZE5

...