删除每个单词的中间部分

时间:2016-05-07 00:14:37

标签: ruby regex string

我想删除字符串中每个单词的中间(非首字母和最后一个字符)。

"Bob" #=> "Bb"
"12309123" #=> "13"
"Davy Jones" #=> "Dy Js"

我该怎么做呢?

6 个答案:

答案 0 :(得分:3)

(?<=\S)\S+(?=\S)替换为

(?<=\S)是一个lookbehind,用于检查之前是否存在非空格字符。

(?=\S)是一个前瞻,用于检查之后是否存在非空格字符。

注意:我不确切地知道你所谓的“一个字”,也许字符类\w更适合你的需要。在这种情况下,您可以避免使用外观,并使用非字边界编写模式,如下所示:

\B\w+\B

答案 1 :(得分:2)

只需使用String's []切片:

foo = 'barbaz'
foo[1..-2] = ''
foo # => "bz"

答案 2 :(得分:1)

这可能并不聪明,但它做同样的事情:"my dog has fleas".gsub(/(\w)\w+(\w)/, "\\1\\2") #=>my dg hs fs

ideone demo / regex demo

答案 3 :(得分:1)

如果你想在不使用正则表达式的情况下实现这一点:

original = 'Davy Jones'.split( )

original.each do |string|
    words = string.split(//)
    no_middle = "#{words[0]}#{words[words.length- 1]}"
    print no_middle
    print ' '
end

输出:

Dy Js 

答案 4 :(得分:1)

str = "How now, brown cow, are you a Jersey?"

str.gsub(/\w+/) { |s| (s.size==1) ? s : s[0]+s[-1] }
  #=> "Hw nw, bn cw, ae yu a Jy?"

...但是@ CasimiretHippolyte的

str.gsub(/\B\w+\B/, "")
  #=> "Hw nw, bn cw, ae yu a Jy?"

是猫的喵喵。

答案 5 :(得分:0)

您可以简单地使用标准的Ruby String#gsub方法。这是它的外观:

string.gsub(/(\w)\w+(\w)/, "\\1\\2")

仅当使用\w+作为内部匹配器模式时有3个或更多字符时才匹配。作为比在同一个地方使用\w*更好的解决方案,通过偶然匹配2个字符单词并将其替换为自身,不会损失性能。

或者,您可以为每个匹配调用#gsub提供一个块:

string.gsub(/\b\w\w\w+\b/) {|s| s[0]+s[-1] }

块版本确保至少3个字符匹配,以便通过不调用块和字符串连接来提高性能,除非它被要求。还有其他(也许更好的)正则表达式可以在这里使用,但是这个表达式很适合。

#gsub还有一个可以使用的就地修改版本,名为#gsub!。它的工作方式相同,但会更改传递给它的字符串。我举例#gsub,但如果您喜欢使用#gsub!,则可以使用相同的技巧。

以下是使用两种方法使用示例字符串和另一个示例的示例:

strings = [ \
  "Bob",         #=> "Bb"
  "12309123",    #=> "13"
  "Davy Jones",  #=> "Dy Js"
  "How now brown cow, may your day be a model of happiness"
]

strings.each do |string|
  puts "String '#{string}' becomes '#{string.gsub(/(\w)\w+(\w)/, "\\1\\2")}'"
  puts "String '#{string}' becomes '#{string.gsub(/\b\w\w\w+\b/) {|s| s[0]+s[-1] }}'"
end

这将输出以下内容:

String 'Bob' becomes 'Bb'
String 'Bob' becomes 'Bb'
String '12309123' becomes '13'
String '12309123' becomes '13'
String 'Davy Jones' becomes 'Dy Js'
String 'Davy Jones' becomes 'Dy Js'
String 'How now brown cow, may your day be a model of happiness' becomes 'Hw nw bn cw, my yr dy be a ml of hs'
String 'How now brown cow, may your day be a model of happiness' becomes 'Hw nw bn cw, my yr dy be a ml of hs'