尝试使用正则表达式查找和替换一批转换,但我实际上不确定是否有可能,更不用说如何实现此目标了。
使用Sublime文本作为编辑器,如果可能的话,请打开其他工具来完成此操作。
两条示例行:
Session::flash( 'error', 'Only users with permission may view the directory user.' );
Session::flash( 'error', 'System user ID does not exist.' );
**期望的结果:**
flash('Only users with permission may view the directory user.')->error();
flash('System user ID does not exist.')->error();
与以下项匹配的当前正则表达式:
Session :: flash(\ s *'error',。*)
文本行是否可以保存并在替换行中重复使用?希望按照$ variable的解决方案,以便我可以将字符串替换为类似的
**如意行:**
flash('$ variable')-> error();
谢谢大家!
答案 0 :(得分:1)
您在这里寻找的是capture group和反向引用。
在正则表达式中,(
和)
中包含的所有内容均为captured
,供以后执行正则表达式匹配的对象使用,本例中为Sublime Text。支持的捕获组的数量根据所使用的正则表达式库的不同而不同,但通常至少为10。
在使用中,每次发生的()
都会创建一个capture
,第一个捕获的编号为1
,第二个捕获的编号为2
,依此类推(通常也是整个匹配都是捕获0
)。使用序列\1
或$1
的意思是“使用第一个捕获组的内容”。
作为示例,考虑正则表达式^([a-z]).\1
。分解:
^
-从一行的开头开始匹配(
-开始捕获[a-z]
-匹配一个小写字母)
-结束捕获.
-匹配任何字符\1
-匹配第一次捕获的内容输入以下内容:
abc
aba
bab
此正则表达式匹配aba
和bab
,因为在两种情况下,第一个字符都是captured
和\1
,并且以后需要匹配。但是abc
不匹配,因为在这种情况下,\1
是a
,而第三个字符是c
。
捕获的结果也可以以相同的方式用于替换文本中。如果您修改正则表达式,则可以捕获要保留的文本并在替换中使用它。
请注意,上述问题中概述的正则表达式在Sublime中不匹配,因为(
启动了一个捕获组,因此与文本中实际的(
不匹配。如果您使用的是Sublime,并且在Highlight Matches
面板中打开了Find/Replace
选项,则会看到正则表达式不被视为匹配项。
查找:
Session::flash\(\s*'error'\s*,(.*)\);
替换:
flash(\1)->error();
结果:
flash( 'Only users with permission may view the directory user.' )->error();
flash( 'System user ID does not exist.' )->error();
这或多或少是您的问题中概述的正则表达式,除了:
您的正则表达式中的(
和)
已替换为\(
和\)
,这是告诉正则表达式该匹配文字{ {1}},不被视为开始捕获。
(
更改为.*
,这意味着“无论此处出现什么文本,都请对其进行捕获以备后用。
替换文本指的是捕获为(.*)
的文本,并将其放回替换文本中。
答案 1 :(得分:1)
您可以使用2个捕获组,并在替换引荐中使用这些捕获组。
\bSession::flash\(\s*'([^']+)',\s*('[^']+')\s*\);
在替换使用中:
flash($2)->$1;
说明
\bSession::flash\(\s*
匹配单词边界以防止Session成为较长单词的一部分,然后匹配Session::flash(
,后跟0+乘以空白字符'([^']+)'
匹配'
,然后使用negated character class捕获不匹配'
的组1,然后再次匹配'
,\s*
匹配一个逗号,后跟0+倍的空白字符('[^']+')
在第2组中匹配'
,然后不是'
,然后是'
\s*\);
匹配0+次空白字符,后跟);
结果:
flash('Only users with permission may view the directory user.')->error;
flash('System user ID does not exist.')->error;