为什么 String#delete 没有从这个字符串中删除 '-' 字符

Why is String#delete not deleting the `-` char from this string

提问人:jbk 提问时间:3/9/2023 更新时间:3/9/2023 访问量:40

问:

我正在尝试使用该方法清理一些电话号码数据,但根据我在 irb 中的测试,当我在参数中以特定顺序显示“-”字符时,它只会删除它。#delete

"(941)979- 2000".delete(" -().")仍然返回 - 现在;=> 而删除 -;=>"941979-2000""(941)979- 2000".delete(" ()-.")"9419792000"

我对这种方法的参数要求有什么误解?

Ruby 字符串

评论

0赞 Dave Newton 3/9/2023
ruby-doc.org/core-2.4.1/String.html#method-i-delete
0赞 Cary Swoveland 3/10/2023
我想提出一些建议,以组织您提交给 SO 的问题。在这里,你首先说,“我正在努力消毒......”,但读者不会理解你的意思,所以这些话只是浪费墨水。你需要具体说明你要做什么,而不引用你尝试过的代码。在用文字陈述问题之后,如果您认为这对读者有帮助,请举出一个或多个示例进行说明。重要提示:显示您给出的每个示例的所需结果。完成后,您可以描述您尝试过的内容以及为什么它不起作用。

答:

2赞 Jörg W Mittag 3/9/2023 #1

根据 String#delete 的文档字符选择器意味着: -().

  • 和之间的任何字符(即 、 、 、 、 、 和 ) 或 ( !"#$%&'(
  • )
  • .

即此字符选择器选择的所有字符的集合为 、 、 、 、 和 。 !"#$%&'().

字符选择器意味着: ()-.

  • (
  • 和 之间的任何字符(即 、 、 、 和).)*+,-.)

即此字符选择器选择的所有字符集为 、 、 、 、 和 (*+,-.

换言之,第一个字符选择器不选择字符,因为所选字符集中不存在 ,而第二个字符选择器选择该字符,因为所选字符集中存在 。----

在不知道您的确切要求的情况下,我的猜测是您真正想要的字符选择器是 or 或 simply 的东西。 \-(). ()\-. ().-

评论

0赞 jbk 3/9/2023
啊哈,我现在完全明白@Jörg,我使用的破折号字符被解释为“在字符范围内的左字符和右字符之间”,愚蠢的我🤪.我本来应该想逃避的。非常感谢您非常清晰且写得很好的答案。
0赞 Cary Swoveland 3/10/2023
转义连字符似乎没有效果:我得到的结果与 如果要将连字符视为要删除的字符之一,则不应将连字符放在字符串的开头或结尾吗?" \-()."" -()."