在ruby中,如果最后一个字符是标点符号,如何从字符串中删除它?

在ruby中,如果最后一个字符是标点符号,如何从字符串中删除它?,ruby,regex,string,substring,Ruby,Regex,String,Substring,嘎,正则表达式有点让人困惑 我正在尝试删除字符串末尾所有可能的标点字符: 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 我相信有更好的办法。有指针吗?所有非单词字符 text.gsub(/\W$/,“”) 这样做的目的是查看

嘎,正则表达式有点让人困惑

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

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

我相信有更好的办法。有指针吗?

所有非单词字符

text.gsub(/\W$/,“”)

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

这确实有效,而且是一种使用正则表达式的ruby方法

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

这基本上用空字符串替换字符串末尾的可选标点字符。如果字符中没有标点符号,则为不可操作。

您应该能够使用正则表达式来完成此操作。我对ruby没有任何经验,但这里有一个正则表达式应该可以工作:

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

您可以使用backreference#1来获取不包含最后一个标点符号字符的字符串。

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

mystring.gsub(/[[:punct:]]+$/,"")
str.sub!(/[[:punct:]]?$/,'')

不使用空字符串:

str = /[?.!,;]?\z/.match(str).pre_match
还是按另一个顺序

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

str.chomp在这种情况下不会执行任何操作。你必须做
str.chop

那个正则表达式和他问的完全不同。它返回一个新的字符串,而不是修改现有的字符串。像rockerest一样,它匹配空格和标点符号。我想我是太直观了。这似乎是他的下一个进步问题。我的错。我不认为
\w
\w
做你认为他们做的事<代码>\w
包括A-Z、A-Z、0-9和
\u
,因此您的测试将留下尾随下划线。该正则表达式不是他要求的。还有许多其他字符与您的匹配,“@”只是一个“@”是标点符号。。。我认为你在滥用特权。请解释一下这篇文章是如何“非常草率,没有付出任何努力,或者是一个答案显然是错误的,可能是危险的”@rockerest,1。他说他想要一个更好的代码。2.你的也和tab一样,绝对不是标点符号。@Matthew,我的上帝。你真的否决了其他每一个答案。“真是个妓女!”洛克里斯特,其他的答案都错了。当竞争对手的答案基本上或完全正确时,我会毫不犹豫地投票给他们。我解释了我所有的反对票。调用制表符和空格标点符号显然是不正确的。简单问题:Wild str.sub!(/[?!,;]?$/,'')足够(并在适当位置修改str),或者我必须设置str=str.sub!(/[?!,;]?$/,'')取而代之,因为它使用的是
sub它将在适当的位置更改字符串。这会产生一个或多个字符,并且点匹配比他列出的5个字符多得多。虽然这不是我需要的(此时),但感谢:点:-我不知道。这将匹配的所有点匹配是什么?请澄清像“#”、“@”、“-”、“#”这样的字符是否符合要删除的内容列表中的标点符号。那么“:”呢?到目前为止,只有我列出的那些。我相信:点刺:包括你提到的其余部分,但我只对删除上面列出的角色感兴趣。