嵌套的正则表达式替换

时间:2016-08-18 14:47:24

标签: regex sublimetext3

我需要创建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

但是当桌子有多个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

1 个答案:

答案 0 :(得分:1)

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

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

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

enter image description here

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