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