我是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位。
任何想法都将受到高度赞赏。先谢谢你。
答案 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