如果两者都存在,则从字符串中删除前导引号和尾随引号

时间:2016-02-03 16:16:00

标签: ruby regex

如果字符串仅在两者都存在的情况下删除引号和尾随引号?例如

"hello world" => hello world
"hello world => "hello world
hello world" => hello world"

我尝试使用gsub,但以下内容删除了所有前导或尾随引号,无论另一个是否存在

'"hello world"'.gsub(/\A"|"\Z/, '')
# => this is ok it returns 'hello world'

'hello world"'.gsub(/\A"|"\Z/, '')
# => returns 'hello world' but should return 'hello world"'

4 个答案:

答案 0 :(得分:3)

您可以使用

str.gsub(/\A"+(.*?)"+\Z/m, '\1')

模式将匹配以一个或多个"开头的字符串,然后它可以包含任何字符,任意数量的字符串,然后是字符串末尾的一个或多个双引号。没有前导和尾随引号的整个字符串将插入到\1反向引用的替换结果中。

请参阅IDEONE demo

要仅删除第一个和最后一个双qoute,您可以使用

str.gsub(/\A"(.*)"\Z/m, '\1')

答案 1 :(得分:1)

我认为这比使用正则表达式更有效。

'"hello world'
.dup.tap{|s| s[0] = s[-1] = "" if s[0] == '"' and s[-1] == '"'}
# => "\"hello world"
'"hello world"'
.dup.tap{|s| s[0] = s[-1] = "" if s[0] == '"' and s[-1] == '"'}
# => "hello world"
'hello world"'
.dup.tap{|s| s[0] = s[-1] = "" if s[0] == '"' and s[-1] == '"'}
# => "hello world\""

答案 2 :(得分:1)

我不打扰使用正则表达式:

def strip_end_quotes(str)
  str[0] == '"' && str[-1] == '"' \
    ? str[1..-2] \
    : str
end

strip_end_quotes '"both"' # => "both"
strip_end_quotes '"left' # => "\"left"
strip_end_quotes 'right"' # => "right\""

在单个正则表达式中执行此操作会导致模式不太清晰,编码时清晰度和可读性非常重要。对那些必须在未来维护代码的人表示怜悯是好的。

答案 3 :(得分:1)

ruby​​的好处在于,在许多情况下,您可以编写类似英语的代码。它的好处在于它易于理解。

x = '"hello world"'
quote = '"'

if x.start_with?(quote) && x.end_with?(quote)
  x = x[1...-1] 
end

puts x #=> hello world