我正在整理地址列表,如:
New york city23 b
Miami 355c
我需要他们看起来像
New York City 23 B
Miami 355 C
问题是在letter+number组合之前和之后添加空间。我想出了下面的准则来强调问题所在:
/\p{L}\d|\d\p{L}/
但我错过了在这两者之间留出空间的逻辑。现在,代码看起来就像
"moscow city46 d".titleize.gsub(/\p{L}\d|\d\p{L}/, ' \0')
# titleize is a Rails method
哪种输出
Moscow Cit y46 D
发布于 2017-04-12 06:37:26
既然您使用了titleize
,那么我假设您不介意使用其他ActiveSupport方法。它并不像一些人那样“聪明”,但是String#squish
用一个空格替换了连续空格的运行,它提供了一个非常简单的解决方案:
str.gsub(/\d+/, ' \0 ').squish.titleize
Ruby (sans Rails)有一个类似的String#squeeze
方法,但与squish
不同的是,它不会修剪前导和尾随空格,因此必须与String#strip
结合。
发布于 2017-04-12 06:30:26
使用查找器并用单个空格替换:
.gsub(/(?<=\p{L})(?=\d)|(?<=\d)(?=\p{L})/, ' ')
(?<=\p{L})(?=\d)|(?<=\d)(?=\p{L})
正则表达式将匹配两个位置:
(?<=\p{L})(?=\d)
-字母和数字之间的位置|
-或(?<=\d)(?=\p{L})
-数字和字母之间的位置。因此,空格将被“插入”在数字或字母之间。
发布于 2017-04-12 06:30:38
'New york city23 b'.scan(/\D+|\d+/).flat_map(&:split).map(&:capitalize).join(' ')
# => "New York City 23 B"
https://stackoverflow.com/questions/43372399
复制相似问题