gsub частичная замена

Похоже, это уже сделано, и вам понадобится продукт под названием vJoy.

https://www.pcgamesn.com/nintendo/nintendo-switch-joy-con-pc-guide

19
задан Orion Edwards 23 September 2008 в 03:34
поделиться

2 ответа

Вы могли сделать что-то вроде этого:

my_string.gsub(/(<--MARKER_START-->)(.*)(<--MARKER_END-->)/, '\1replace_text\3')
14
ответ дан 30 November 2019 в 04:08
поделиться

Можно сделать это с [1 112] предвидение нулевой ширины и оглянуться утверждения .

Этот regex должен работать в рубиновых 1.9 и в жемчуге и многих других местах:

Примечание: рубиновые 1.8 только утверждения предвидения поддержек. Вы нуждаетесь и в предвидении и оглядываетесь, чтобы сделать это правильно.

 s.gsub( /(?<=<--MARKER START-->).*?(?=<--MARKER END-->)/, 'replacement text' )

то, Что происходит в рубиновых 1.8, ?<= причины это для катастрофического отказа, потому что это не понимает оглянуться утверждения. Для той части затем необходимо отступить к использованию обратной ссылки - как [1 113] упоминания Greig Hewgill

поэтому, что Вы получаете,

 s.gsub( /(<--MARKER START-->).*?(?=<--MARKER END-->)/, '\1replacement text' )

ОБЪЯСНЕНИЕ ПЕРВОЕ:

я заменил (.)* посреди Вашего regex с .*? - это нежадно. Если Вы не будете иметь нежадными, то Ваш regex попытается соответствовать столько, сколько он может - если у Вас есть 2 маркера на одной строке, он идет не так, как надо. Это лучше всего проиллюстрировано примером:

"<b>One</b> Two <b>Three</b>".gsub( /<b>.*<\/b>/, 'BOLD' )
=> "BOLD"

, Что мы на самом деле хотим:

"<b>One</b> Two <b>Three</b>".gsub( /<b>.*?<\/b>/, 'BOLD' )
=> "BOLD Two BOLD"

ОБЪЯСНЕНИЕ ВТОРОЕ:

zero-width-look-ahead-assertion походит на гигантскую груду nerdly беспорядка.

то, Что на самом деле означает "предусматривать-утверждение", является "Только соответствием, если вещь, которую мы ищем, сопровождается этим другим материалом.

, Например, только соответствуйте цифре, если она сопровождается F.

"123F" =~ /\d(?=F)/ # will match the 3, but not the 1 or the 2

то, Что на самом деле означает "нулевая ширина", "рассматривают 'сопровождаемый' в нашем поиске, но не считают его как часть соответствия при выполнении замены или группировке или подобных вещей. Используя тот же пример 123F, Если мы не использовали предварительное утверждение и вместо этого просто сделали это:

"123F" =~ /\dF/ # will match 3F, because F is considered part of the match

, Как Вы видите, это идеально для проверки наш <--MARKER END-->, но в чем мы нуждаемся для эти <--MARKER START-->, способность сказать "Только соответствие, если вещь, которую мы ищем, СЛЕДУЕТ за этим другим материалом". Это назвало оглянуться утверждение, которое рубиновые 1.8 не имеет по некоторой странной причине..

Hope, которая имеет смысл :-)

пз: Почему утверждения предвидения использования вместо просто обратных ссылок? При использовании предвидения Вы на самом деле не заменяете эти <--MARKER--> биты, только содержание. При использовании обратных ссылок Вы заменяете всех. Я не знаю, подвергается ли это большой части хита производительности, но с точки зрения программирования она походит на правильный поступок, поскольку мы на самом деле не хотим заменять маркеры вообще.

16
ответ дан 30 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: