假设我有这个字符串:a = "Vallås centrum HALMSTAD"
我想删除所有小写、空格和第一个大写字母,所以我只有一个字符串a => "HALMSTAD"
我试过这样的事情:
a = "Vallås centrum HALMSTAD"
b = a.gsub(/[:lower:]/, "")
puts b
但我得到这个输出:a => "Vaås cntum HALMSTAD"
关于如何做到这一点的任何想法?
我相信您应该匹配大写单词(包括其中的连续单词和可能的标点符号)并将其余的替换为空字符串。
正则表达式会
\b([A-Z']+\s*)\b
这将匹配并捕获所有大写单词,包括连续单词。
考虑的示例字符串:
Vallås centrum ISN'T blah Blah HALMSTAD AND BLAh
这匹配:
不是
哈姆斯塔德和
尝试这个:
your_string.split.last
这取决于您是要“仅删除小写字符”(并保留空格)还是“仅保留大写字符”(并丢失空格)。我建议也许以下更接近你所追求的?
a = "Vallås centrum HALMSTAD"
b = a.gsub(/[^[:upper:]]+/, "")
puts b # => "VHALMSTAD"
尝试这个:
a = "Vallås centrum ISN'T blah Blah HALMSTAD AND "
b = a.gsub(/\b[A-Z]?[^A-Z\s']+\s*\b/, '')
puts b
这应该处理大多数小写单词,但您需要处理其他可能的情况,其中有标点符号、问号、感叹号、非 ASCII 字符等......
你可以在这里摆弄这个
鉴于@TimPietzcker 对非 ASCII 字符的评论,您可以用A-Z
POSIX 括号表达式替换[[:upper:]]
更新:
这将是一个更完整的解决方案:
正则表达式查找大多数小写单词(这仍然可以扩展为更多符号):
\b(?:[^\s]?[[:lower:]][^\s]?)+\s*\b[?!]?
在这里测试正则表达式
红宝石代码:
a = "Vallås centrum ISN'T blah Blah HALMSTAD AND BlaG and bLag's? FINISH "
b = a.gsub(/\b(?:[^\s]?[[:lower:]][^\s]?)+\s*\b[?!]?/, '')
puts b
在这里摆弄代码