【问题标题】:Nested regex replacement嵌套正则表达式替换
【发布时间】:2016-08-19 20:55:13
【问题描述】:

我需要创建 laravel 迁移,因此我使用 Sublime Text 中的正则表达式“在文件中替换”将我的 SQL 脚本转换为 laravel 迁移格式。

我的问题是我必须在大约 70 个表中用“tablename”替换以下字符串中的“@”字符:

Schema::table('tablename', function($table) {
        $table->dropForeign('@_columnname_foreign');
});

其实我可以用下面的表达式来做到这一点:

(Schema::table\('([a-z]+)',[\s]*function\(\$table\)[\s]*{[\s]*\$table->dropForeign\(')@(_[a-z_]+'\);)

在替换字段中:

$1$2$3

但是当table有多个fk时我不知道怎么办:

Schema::table('tablename1', function($table) {
    $table->dropForeign('@_field1_foreign');
    $table->dropForeign('@_field2_foreign');
    $table->dropForeign('@_field3_foreign');
    $table->dropForeign('@_field4_foreign');
    $table->dropForeign('@_field5_foreign');
    $table->dropForeign('@_field6_foreign');
});

我一直在使用这个网站来验证我的正则表达式RegExr

【问题讨论】:

  • @revo,我只是确定:SublimeTex2 和 SublimeText3 正则表达式实现之间存在差异。删除我的 cmets。
  • 这很奇怪。清除地雷。 @WiktorStribiżew

标签: regex sublimetext3


【解决方案1】:

对于 Sublime Text 中的正则表达式来说,这不是一件容易的事。使用正则表达式的唯一方法是确保使用可选数量的table-dropForeign 行(延迟匹配)捕获函数签名,并在下一行替换@s。

下面的正则表达式需要多次单击全部替换,直到找到所有匹配项

(Schema::table\('([a-z0-9]+)',\s*function\(\$table\)\s*{(?:\s*\$table->dropForeign\('[a-z0-9]+_\w+'\);)*?\s*\$table->dropForeign\(')@(_\w+'\);)

替换为$1$2$3。请参阅this regex demo,您可以在其中手动将第二个块中的@ 替换为表名,看看匹配情况如何进一步发展。

详情

  • (Schema::table\('([a-z0-9]+)',\s*function\(\$table\)\s*{(?:\s*\$table->dropForeign\('[a-z0-9]+_\w+'\);)*?\s*\$table->dropForeign\(') - 第 1 组捕获:
    • Schema::table\(' - 文字 Schema::table(' 子字符串
    • ([a-z0-9]+) - 第 2 组捕获 1+ 个字母数字(不要选中 匹配大小写 选项以匹配大写 ASCII 字母)
    • ',\s* - 一个逗号和 0+ 个空格
    • function\(\$table\) - 文字 function($table)
    • \s* - 0+ 个空格
    • { - 文字 {(在 SublimeText 2 中,它需要转义)
    • (?:\s*\$table->dropForeign\('[a-z0-9]+_\w+'\);)*? - 0+ 个序列,但尽可能少,匹配:
      • \s*\$table->dropForeign\(' - 0+ 个空格,然后是文字 `​​$table->dropForeign('
      • [a-z0-9]+_\w+ - 1+ 个字母数字、_ 和 1+ 个数字、字母或下划线 (\w+)
      • '\); - 文字子字符串 ');
    • \s* - 0+ 个空格
    • \$table->dropForeign\(' - 文字文本 $table->dropForeign('
  • @ - 要替换​​的匹配 @ 符号
  • (_\w+'\);) - 第 2 组捕获:
    • _ - 下划线
    • \w+ - 1 个或多个字母、数字或下划线
    • '\); - 文字子字符串 ');

注意:我认为我发现的问题与未转义的 { 有关,这会导致 Sublime Text 2 中的正则表达式失败。在 Sublime Text 3 中,正则表达式中的 { 不会必须逃脱。

【讨论】:

  • 嗯,这比在大约 70 个表定义中复制和粘贴要好! :) 谢谢!
猜你喜欢
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多