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