我有一个字符串 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"
答案 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(/^'/, "")