使用正则表达式提取

时间:2012-03-30 11:50:58

标签: ruby regex rubular

我是Ruby,Regex和Stackoverflow的新手。 xD这是我的问题:

我想使用正则表达式从越南文本中提取除标准ASCII字符之外的连续单词组成的短语。

换句话说,仅包含 \ w 字符的短语,例如:

  

MìnhrấtthíchaomSharpnày(mặcdùchưaxàibaonnhưngchỉnghecác   你好吗? Cácbạnchomìnhhỏi1câu(các   bạnđừngchêmìnhngunhétộinghiệpmình):cáimáyníyđemsangAnh   dùngmạngVodafonelàdùngvôtưah`? NếudùngđượcbênAnhmàkhông   phảichọcngoáyjthìmìnhmuamộtái

不关心它的含义,我想要实现的是包含2对结果的哈希数组: value => 提取短语的值,starting_position => 第一个角色的位置

根据示例,它应该是这样的: [{:value =>“con Sharp”,:starting_position => 16},{:value =>“bao h”,:starting_position => blah blah} ...]

这意味着所有包含 \ W 字符的单词,例如“mình”,“rất”,“thích”等都会被拒绝。

rubular.com 上针对 Ruby 1.9.2 尝试使用此正则表达式的上述示例:

  

\ B [\ W | \ S] + \ B'/强>

我几乎得到了我想要的短语(除了仅限空格的短语),但它似乎不适用于我的Ruby,它也是1.9.2p290,使用Win 7 64位。

任何想法都将受到高度赞赏。先谢谢你。

1 个答案:

答案 0 :(得分:1)

根据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,类似于:
How do I get the match data for all occurrences of a Ruby regular expression in a string?

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