2016-12-21 4 views
1

У меня есть строка aString = "old_tag1, old_tag2, 'new_tag1', 'new_tag2'" Я хочу заменить апострофы, которые идут прямо перед или сразу после запятой. Например, в моем случае апострофы, содержащие new_tag1 и new_tag2, должны быть удалены. Это то, что я прямо сейчасКак заменить все апострофы, которые поступают прямо или после запятой?

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

Это, однако, проблематично, поскольку она удаляет любые апостроф внутри, например, если бы я был «my_tag на» вместо «new_tag1». Как мне избавиться только от апострофов, которые появляются перед запятыми или после них?

Мой требуемый выход

aString = "old_tag1,old_tag2,new_tag1,new_tag2" 
+0

Пожалуйста, укажите желаемый результат для вашего примера. –

+0

Кроме того, соглашение Ruby должно использовать [случай змеи] (https://en.wikipedia.org/wiki/Snake_case) для имен локальных переменных и методов. Здесь, например, вы можете использовать 'astring',' a_string' или 'str'. Это просто конвенция, поэтому вам не нужно это делать, но 99% + Rubiest придерживаются конвенции. –

+0

Ваш желаемый результат не соответствует вашему описанию алгоритма. Откуда проходил апостроф после 'new_tag2'? Это не сразу или сразу после запятой, так почему это было удалено? –

ответ

0

Это отвечает на вопрос, «Я хочу, чтобы заменить апострофы, которые приходят прямо перед или сразу же после запятой».

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 
+0

Обратите внимание, последний апостроф все еще там –

+0

@ Димитрий, спрашивающий сказал: «Я хочу заменить апострофы, которые появляются прямо или сразу после запятой». Это однозначно и то, что я сделал. Ответчик говорит, что апострофы, содержащие «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 модификатор для регулярных выражений, я не знал об этом! Очень полезно для объяснения.

+0

Я не сделал это%) Это было в теге body –

0

Non регулярные выражения замены

Регулярные выражения могут получить действительно некрасиво. Существует простой способ сделать это только с заменой строки: Поиск по шаблону ,' и ', и заменить с ,

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

Это оставляет задн ', но это легко удалить с .chomp("'"). Ведущий ' может быть удален простым регулярным выражением .gsub(/^'/, "")

Смежные вопросы