我不确定如何在函数中使用正则表达式,以便我可以抓住以特定字母开头的句子中的所有单词。我知道我能做到:
word =~ /^#{letter}/
检查单词是否以字母开头,但我如何逐字逐句。我是否需要将字符串转换为数组然后遍历每个单词或使用正则表达式更快?我正在使用红宝石,所以看起来像:
matching_words = Array.new
sentance.split(" ").each do |word|
matching_words.push(word) if word =~ /^#{letter}/
end
答案 0 :(得分:1)
您可以使用\b
。它匹配单词边界 - 一个单词之前和之后的不可见点。 (你看不到它们,但是哦,它们就在那里!)这是正则表达式:
/\b(a\w*)\b/
\w
匹配单词字符,如字母和数字等字样。
你可以在这里看到我测试它:http://rubular.com/regexes/13347
答案 1 :(得分:1)
与Anon相似。答案:
/\b(a\w*)/g
然后用(通常)$ n查看所有结果,其中n是第n个命中。许多库将在$ n组括号中将/ g结果作为数组返回,因此在这种情况下$ 1将返回所有匹配单词的数组。你想要仔细检查你正在使用的任何库来弄清楚它是如何返回这样的匹配,遗憾的是全局搜索返回有很多变化。
对于\ w vs [a-zA-Z],你有时可以通过使用类似内容的内置定义来加快执行速度,因为它可以很容易地为预设字符类提供优化路径。 / p>
最后的/ g使它成为一个“全局”搜索,所以它会找到不止一个。但是,它仍然受某些语言/库中的限制,因此,如果您希望检查整个文件,有时需要/ gm,以使其成为多行
如果您想删除结果,例如您的标题(但不是问题)建议,请尝试:
/\ba\w*//g
在大多数语言中进行搜索和替换(/<search>/<replacement>/
)。有时你需要前面的“s”。取决于语言/库。在Ruby的情况下,使用:
string.gsub(/(\b)a\w*(\b)/, "\\1\\2")
保留非单词字符,并可选择在\ 1和\ 2之间放置任何替换文本。 gsub为global,sub为第一个结果。
答案 2 :(得分:1)
扫描可能是一个很好的工具:
#!/usr/bin/ruby1.8
s = "I think Paris in the spring is a beautiful place"
p s.scan(/\b[it][[:alpha:]]*/i)
# => ["I", "think", "in", "the", "is"]
\b
表示'字边界。」[:alpha:]
表示大写或小写字母(a-z)。答案 3 :(得分:0)
/\ba[a-z]*\b/i
将匹配以“a”开头的任何字词。
\b
表示单词边界 - 我们只想从单词的开头开始匹配。
然后是我们想要开头的角色。
然后我们有尽可能多的字母字符,然后是另一个字边界。
答案 4 :(得分:0)
要匹配以t
开头的所有字词,请使用:
\bt\w+
匹配test
但不匹配footest
; \b
表示“字边界”。
答案 5 :(得分:0)
我个人认为正则表达式对于这个应用程序来说太过分了,只需运行一个select就能解决这个特定问题。
"this is a test".split(' ').select{ |word| word[0,1] == 't' }
result => ["this", "test"]
或者如果您决定使用正则表达式,那么请使用grep
"this is a test".split(' ').grep(/^t/)
result => ["this", "test"]
希望这有帮助。