5

有谁知道对字符串的外引号进行操作的Ruby gem(或内置或本机语法)?

我发现自己一遍又一遍地编写这样的方法:

remove_outer_quotes_if_quoted( myString, chars ) -> aString
add_outer_quotes_unless_quoted( myString, char ) -> aString

第一个测试myString看它的开始和结束字符是否匹配chars. 如果是这样,它会返回去掉引号的字符串。否则它会原封不动地返回它。chars默认为引号字符列表。

第二个测试myString看它是否已经以 . 开头和结尾char。如果是这样,它会返回未更改的字符串。char如果不是,它返回带有前后附加的字符串,并且任何嵌入的出现char都用反斜杠转义。char默认为默认字符列表中的第一个。

(当然,我手工拼凑的方法没有这么冗长的名称。)

我在公共回购中四处寻找类似的方法,但找不到这样的东西。我是唯一需要这样做的人吗?如果没有,其他人如何做到这一点?

4

3 回答 3

5

如果你经常这样做,你可能想给 String 添加一个方法:

class String
  def strip_quotes
    gsub(/\A['"]+|['"]+\Z/, "")
  end
end

然后你就可以打电话了string.strip_quotes

添加引号是类似的:

class String
  def add_quotes
     %Q/"#{strip_quotes}"/ 
  end
end

这被称为string.add_quotes并在添加双引号之前使用 strip_quotes。

于 2010-12-13T00:30:28.013 回答
2

这可能会“解释如何删除和添加它们:

str1 = %["We're not in Kansas anymore."]
str2 = %['He said, "Time flies like an arrow, Fruit flies like a banana."']

puts str1
puts str2

puts

puts str1.sub(/\A['"]/, '').sub(/['"]\z/, '')
puts str2.sub(/\A['"]/, '').sub(/['"]\z/, '')

puts 

str3 = "foo"
str4 = 'bar'

[str1, str2, str3, str4].each do |str|
  puts (str[/\A['"]/] && str[/['"]\z/]) ? str : %Q{"#{str}"}
end

原来的两行:

# >> "We're not in Kansas anymore."
# >> 'He said, "Time flies like an arrow, Fruit flies like a banana."'

剥离报价:

# >> We're not in Kansas anymore.
# >> He said, "Time flies like an arrow, Fruit flies like a banana."

需要时添加引号:

# >> "We're not in Kansas anymore."
# >> 'He said, "Time flies like an arrow, Fruit flies like a banana."'
# >> "foo"
# >> "bar"
于 2010-12-13T00:02:42.217 回答
0

我会使用value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0]). 简而言之,这个简单的代码检查字符串的第一个和最后一个字符是否相同,如果它们是单引号/双引号,则将其删除。此外,可以添加任意数量的报价类型。

%w["adadasd" 'asdasdasd' 'asdasdasd"].each do |value|
  puts 'Original value: ' + value
  value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0])
  puts 'Processed value: ' + value
end

上面的示例将打印以下内容:

Original value: "adadasd"
Processed value: adadasd
Original value: 'asdasdasd'
Processed value: asdasdasd
Original value: 'asdasdasd"
Processed value: 'asdasdasd"
于 2017-12-28T15:23:19.327 回答