如何替换逗号之前或之后出现的所有撇号?

时间:2016-12-21 04:15:57

标签: ruby-on-rails ruby regex

我有一个字符串 aString =" old_tag1,old_tag2,' new_tag1',' new_tag2'" 我想替换逗号之前或之后出现的撇号。例如,在我的情况下,应删除包含new_tag1和new_tag2的撇号。 这就是我现在所拥有的

aString = aString.gsub("'", "")

然而这是有问题的,因为它删除了内部的任何撇号,例如,如果我有' my_tag' s'而不是' new_tag1'。我如何摆脱逗号之前或之后的撇号?

我想要的输出是

aString = "old_tag1,old_tag2,new_tag1,new_tag2"

3 个答案:

答案 0 :(得分:1)

我的猜测也是使用正则表达式,但稍微以其他方式:

aString = "old_tag1,old_tag2,'new_tag1','new_tag2','new_tag3','new_tag4's'"
aString.gsub /(?<=^|,)'(.*?)'(?=,|$)/, '\1\2\3'
#=> "old_tag1,old_tag2,new_tag1,new_tag2,new_tag3,new_tag4's"

我们的想法是找到一个带有边界撇号的子字符串,并在没有它的情况下粘贴它。

regex = /
  (?<=^|,) # watch for start of the line or comma before
  '        # find an apostrophe
  (.*?)    # get everything between apostrophes in a non-greedy way
  '        # find a closing apostrophe
  (?=,|$)  # watch after for the comma or the end of the string
/x

替换部件只是粘贴第一,第二和第三组的内容(括号之间的所有内容)。

感谢@Cary /x用于正则表达式的修饰符,我对此一无所知!非常有用的解释。

答案 1 :(得分:0)

这回答了问题,&#34;我想要替换逗号之前或之后的撇号&#34;。

r = /
    (?<=,) # match a comma in a positive lookbehind
    \'     # match an apostrophe
    |      # or
    \'     # match an apostrophe
    (?=,)  # match a comma in a positive lookahead
    /x     # free-spacing regex definition mode        

aString = "old_tag1,x'old_tag2'x,x'old_tag3','new_tag1','new_tag2'"

aString.gsub(r, '')
  #=> => "old_tag1,x'old_tag2'x,x'old_tag3,new_tag1,new_tag2'"

如果目标是删除包含子字符串的单引号,当左引号位于字符串的开头或者后面紧跟逗号,右引号位于字符串的末尾或者后面紧跟着逗号,有几种方法是可能的。一种是使用单个修改后的正则表达式,正如@Dimitry所做的那样。另一种方法是在逗号上拆分字符串,处理结果数组中的每个字符串,然后连接修改后的子字符串,用逗号分隔。

r = /
    \A     # match beginning of string
    \'     # match single quote
    .*     # match zero or more characters
    \'     # match single quote
    \z     # match end of string
    /x     # free-spacing regex definition mode

aString.split(',').map { |s| (s =~ r) ? s[1..-2] : s }.join(',')
  #=> "old_tag1,x'old_tag2'x,x'old_tag3',new_tag1,new_tag2"

注意:

arr = aString.split(',')
  #=> ["old_tag1", "x'old_tag2'x", "x'old_tag3'", "'new_tag1'", "'new_tag2'"]
"old_tag1"     =~ r #=> nil
"x'old_tag2'x" =~ r #=> nil
"x'old_tag3'"  =~ r #=> nil
"'new_tag1'"   =~ r #=> 0
"'new_tag2'"   =~ r #=> 0

答案 2 :(得分:0)

非正则表达式替换

正则表达式可能变得非常难看。有一种简单的方法可以只使用字符串替换:搜索模式,'',并替换为,

aString.gsub(",'", ",").gsub("',", ",")
=> "old_tag1,old_tag2,new_tag1,new_tag2'"

这会留下尾随',但使用.chomp("'")很容易删除。可以使用简单的正则表达式'

删除前导.gsub(/^'/, "")