Textmate Regex Найти Заменить Помощь - PullRequest
1 голос
/ 30 декабря 2008

У меня есть проект, который я работаю над преобразованием некоторых устаревших форм Perl CGI в PHP. Многое из этого требует поиска / замены информации. В одном из таких случаев у меня есть такие строки в скрипте perl:

<INPUT type="radio" name="trade" value="1" $checked{trade}->{1}>

, который должен читать:

<INPUT type="radio" name="trade" value="1" <?php echo checked('trade', 1); ?>>

Другой пример, демонстрирующий некоторые различия в отображении этих тегов в perl / html:

<INPUT type="radio" name="loantype" value="new" $checked{loantype}->{new}>
<INPUT type="radio" name="loantype" value="new" $checked{'loantype'}->{new}>
<INPUT type="radio" name="loantype" value="new" $checked{'loantype'}->{'new'}>
<INPUT type="radio" name="loantype" value="new" $checked{loantype}->{'new'}>

Как видите, кавычки могут быть где угодно, но это не моя проблема. Я решил написать регулярное выражение поиска / замены в textmate, чтобы сделать мою жизнь немного проще. Мой Regex выглядит так:

Find:     \$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}
Replace:  <?php echo checked('$1', '$2'); ?>

Это работало нормально в первом файле, с которым я это делал, но по какой-то причине в текущем файле Regex стал действительно жадным, соответствуя многим строкам. он будет соответствовать началу (\ $ флажок ...), а затем совпадать до последнего раза, когда появится символ '}. Я попробовал несколько вариантов, чтобы сделать его немного менее жадным, включая:

 ^(.*)\$checked\{'?([^']+)'?\}->\{'?([^']+)'?\}(.*)$

Но даже это, кажется, соответствует нескольким строкам. Я предполагал, что ^ в начале будет соответствовать только началу строки, а $ в конце будет соответствовать только концу ... ограничивая мое совпадение 1 строкой ... но это не так.

/ мне не удается в регулярном выражении

Спасибо за любую помощь, Mike

1 Ответ

2 голосов
/ 30 декабря 2008

Попробуйте это:

^(.*?)\$checked\{'?([^']+?)'?\}->\{'?([^']+?)'?\}(.*?)$

? после * и + делают их "не жадными".

...