-2

假设我有这个字符串:a = "Vallås centrum HALMSTAD" 我想删除所有小写、空格和第一个大写字母,所以我只有一个字符串a => "HALMSTAD"

我试过这样的事情:

a = "Vallås centrum HALMSTAD"
b = a.gsub(/[:lower:]/, "")
puts b

但我得到这个输出:a => "Vaås cntum HALMSTAD"

关于如何做到这一点的任何想法?

4

4 回答 4

1

我相信您应该匹配大写单词(包括其中的连续单词和可能的标点符号)并将其余的替换为空字符串。

正则表达式会

\b([A-Z']+\s*)\b

这将匹配并捕获所有大写单词,包括连续单词。

红色链接

考虑的示例字符串:

Vallås centrum ISN'T blah Blah HALMSTAD AND BLAh

这匹配:

不是
哈姆斯塔德和

于 2012-09-11T17:17:29.293 回答
1

尝试这个:

your_string.split.last
于 2012-09-11T19:01:38.847 回答
1

这取决于您是要“仅删除小写字符”(并保留空格)还是“仅保留大写字符”(并丢失空格)。我建议也许以下更接近你所追求的?

a = "Vallås centrum HALMSTAD"
b = a.gsub(/[^[:upper:]]+/, "")
puts b # => "VHALMSTAD"
于 2012-09-11T17:19:52.973 回答
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 字符等......

你可以在这里摆弄这个


鉴于@TimPietzcker 对非 ASCII 字符的评论,您可以用A-ZPOSIX 括号表达式替换[[: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

在这里摆弄代码

于 2012-09-11T17:43:30.577 回答