查找并替换为可变文本

时间:2019-05-09 01:52:20

标签: regex string replace sublimetext3

尝试使用正则表达式查找和替换一批转换,但我实际上不确定是否有可能,更不用说如何实现此目标了。

使用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();

谢谢大家!

2 个答案:

答案 0 :(得分:1)

您在这里寻找的是capture group和反向引用。

在正则表达式中,()中包含的所有内容均为captured,供以后执行正则表达式匹配的对象使用,本例中为Sublime Text。支持的捕获组的数量根据所使用的正则表达式库的不同而不同,但通常至少为10。

在使用中,每次发生的()都会创建一个capture,第一个捕获的编号为1,第二个捕获的编号为2,依此类推(通常也是整个匹配都是捕获0)。使用序列\1$1的意思是“使用第一个捕获组的内容”。

作为示例,考虑正则表达式^([a-z]).\1。分解:

  • ^-从一行的开头开始匹配
  • (-开始捕获
  • [a-z]-匹配一个小写字母
  • )-结束捕获
  • .-匹配任何字符
  • \1-匹配第一次捕获的内容

输入以下内容:

abc
aba
bab

此正则表达式匹配ababab,因为在两种情况下,第一个字符都是captured\1,并且以后需要匹配。但是abc不匹配,因为在这种情况下,\1a,而第三个字符是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}},不被视为开始捕获。

  2. (更改为.*,这意味着“无论此处出现什么文本,都请对其进行捕获以备后用。

替换文本指的是捕获为(.*)的文本,并将其放回替换文本中。

答案 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+次空白字符,后跟);

Regex demo

结果:

flash('Only users with permission may view the directory user.')->error;
flash('System user ID does not exist.')->error;