我需要创建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
答案 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+
- 一个或多个字母,数字或下划线'\);
- 文字子串');
注意:我认为我发现的问题与未转义的{
相关,导致Sublime Text 2中的正则表达式失败。在Sublime Text 3中,{
in正则表达式不必被转义。