【问题标题】:Textmate Regex Find Replace HelpTextmate Regex 查找替换帮助
【发布时间】:2010-09-28 21:37:30
【问题描述】:

我有一个项目,我正在将一些旧的 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 中编写一个查找/替换正则表达式,让我的生活更轻松一些。我的正则表达式看起来像:

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

这在我使用的第一个文件中运行良好,但由于某种原因,在当前文件中,正则表达式变得非常贪婪,匹配了很多行。它将匹配开头 (\$checked...),然后匹配到字符 '}' 出现的最后一次。我尝试了一些变体以使其不那么贪婪,包括:

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

但即使这样似乎也匹配多行。我假设开头的 ^ 只会匹配一行的开头,而末尾的 $ 只会匹配结尾...将我的匹配限制为 1 行...但似乎并非如此。

/me 在正则表达式中失败

感谢您的帮助, 迈克

【问题讨论】:

    标签: php regex replace find textmate


    【解决方案1】:

    试试这个:

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

    *+ 之后的 ? 使它们“不贪婪”。

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      相关资源
      最近更新 更多