如果是标点符号,我怎么能从字符串中删除最后一个字符?

时间:2011-04-04 16:18:15

标签: ruby regex string substring

Gah,正则表达式有点令人困惑。

我正在尝试删除字符串末尾的所有可能的标点字符:

if str[str.length-1] == '?' || str[str.length-1] == '.' || str[str.length-1] == '!' or str[str.length-1] == ',' || str[str.length-1] == ';' 
    str.chomp!
end

我确信有更好的方法可以做到这一点。有什么指针吗?

7 个答案:

答案 0 :(得分:8)

str.sub!(/[?.!,;]?$/, '')
  • [?.!,;] - 角色类。匹配这5个字符中的任何一个(注意,.在字符类中并不特殊)
  • ? - 上一个字符或组是可选的
  • $ - 字符串结束。

这基本上用空字符串替换字符串末尾的可选标点符号。如果角色没有标点符号,那就是无操作。

答案 1 :(得分:2)

最初的问题是“删除字符串末尾的所有可能的标点符号”,但是仅提到的示例显示了5,“?”,“。”,“!”,“,”,“;”。其他标点符号如“:”,“”等应包含在“所有可能的标点符号”中,因此请使用kurumi所指出的:punct:character类:

str.sub!(/[[:punct:]]?$/,'')

答案 2 :(得分:0)

所有非单词字符。

text.gsub(/\W$/, "")

这样做的目的是查看字符串,在结尾处找到标点符号,并全局替换为nothing =从而删除它。

这确实有效,而且使用正则表达式是一种红宝石。

答案 3 :(得分:0)

您应该能够使用正则表达式来执行此操作。我对ruby没有任何经验,但这是一个应该有效的RegEx:

/(.*)[^\w\d]?$/

您可以使用反向引用#1来获取没有最后一个标点字符的字符串。

答案 4 :(得分:0)

mystring.gsub(/[[:punct:]]+$/,"")

答案 5 :(得分:0)

不使用空字符串:

str = /[?.!,;]?\z/.match(str).pre_match

或以其他顺序

str = str.match(/[?.!,;]?\z/).pre_match

答案 6 :(得分:0)

在这种情况下,

str.chomp!不会做任何事情。你必须做str.chop!