为什么带正则表达式的gsub会为单引号和双引号返回不同的结果?

时间:2013-05-06 17:53:04

标签: ruby regex

我有以下文本,我尝试匹配并删除反斜杠和以下数字:

these failings is india\342\200\231s reluctance

当我使用单引号创建一个字符串并使用\\\d+时,我会删除这些字符,但是双引号中的此文本返回相同的内容。以下演示了我想说的内容:

>> "these failings is india\342\200\231s reluctance".gsub(/\\\d+/, "")
>> "these failings is india\342\200\231s reluctance"
>> 'these failings is india\342\200\231s reluctance'.gsub(/\\\d+/, "")
>> "these failings is indias reluctance"

原因是什么?如何在双引号中删除这些字符?

1 个答案:

答案 0 :(得分:4)

你的问题不在于正则表达式,你的问题在于字符串本身。当你这样说:

"these failings is india\342\200\231s reluctance"

\342\200\231由字符串解释为为八进制中的三个字节,这三个字节是的UTF-8表示形式;结果是你的字符串看起来像这样:

"these failings is india’s reluctance"

这三个字节只是一个UTF-8字符。如果使用单引号构建字符串:

'these failings is india\342\200\231s reluctance'

然后八进制转义序列根本不被解释为八进制字节值,它们只是十二个字符:

\ 3 4 2 \ 2 0 0 \ 2 3 1
你在编辑中看到的

如果你想删除那个特定的撇号字符,那么你可以这样使用tr

"these failings is india\342\200\231s reluctance".tr("\342\200\231", '')

gsub喜欢这样(或其他各种方式):

"these failings is india\342\200\231s reluctance".gsub("\342\200\231", '')
"these failings is india\342\200\231s reluctance".gsub(/\342\200\231/, '')

请注意,正则表达式文字提供双引号字符串上下文,因此\nnn将被解释,就像它们在双引号字符串中一样。

您可能希望从前到后查看编码设置,以确保所有内容(包括终端和编辑器)都设置为使用UTF-8。那会让你的问题更清楚。