Рубиновый не жадный модификатор не применяется? - PullRequest
1 голос
/ 30 сентября 2019

У меня есть регулярное выражение с не жадным модификатором, которое, похоже, не работает. Я пробовал так много вариантов регулярного выражения и различные другие способы, о которых я мог думать без успеха, что я теряю голову

Я хочу удалить все пустые строки, встроенные в строку s ниже. С моим регулярным выражением я ожидал удалить все вещи, которые совпадают с чем-то = ""

s = 'a,b="cde",f="",g="hi",j=""'

puts s; puts s.gsub( /,.+?="",?/ , "," ).chomp(','); nil

Ожидаемое:

a,b="cde",g="hi"

Что я получу:

a,g="hi"

Почему .+? не жадный в регулярном выражении gsub ниже?

Это работает, если я ограничиваю . набором символов [\w\d_-], но это заставляет меня делать предположения:

puts s; puts s.gsub( /,[\w\d_-]+?=""/ , "" ).chomp(','); nil

# outputs:
a,b="cde",f="",g="hi",j=""
a,g="hi"

Это также работает, если я выполняю какой-то негативный поиск, например:

puts s; puts s.gsub( /,.+?="",?/ , "," ).chomp(','); nil

# outputs:
a,b="cde",f="",g="hi",j=""
a,g="hi"

Но все же я не понимаю, почему это не сработало в первом случае.

1 Ответ

2 голосов
/ 30 сентября 2019

регулярные выражения слева направо. Ваше регулярное выражение ,.+?="",? соответствует первой запятой в строке a,b="cde",f="",g="hi",j="", которая находится между a и b. Затем он пытается найти ="", который существует после ,g, чтобы вы получили фактический результат.

То, что вы хотите: ,[^=]+?="",?, который соответствует 1 или более любому символу, который не является знаком равенства перед="" и в результате вы получите a,b="cde",g="hi".

...