【问题标题】:Find and replace with variable text查找并替换为可变文本
【发布时间】:2019-05-09 01:52:19
【问题描述】:

尝试使用正则表达式查找和替换批量转换,但我不确定这是否可行,更不用说如何实现了。

使用 Sublime text 作为编辑器,如果可能,请打开其他工具来完成此操作。

两个示例行:

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

谢谢各位!

【问题讨论】:

    标签: regex string replace sublimetext3


    【解决方案1】:

    您可以使用 2 个捕获组,并在这些捕获组的替换引用中。

    \bSession::flash\(\s*'([^']+)',\s*('[^']+')\s*\);
    

    在替换使用中:

    flash($2)->$1;
    

    说明

    • \bSession::flash\(\s* 匹配一个 wordboundary 以防止 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;
    

    【讨论】:

    • 太神奇了。我认为你今天改变了我的生活!
    【解决方案2】:

    您在此处查找的是 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 并在 Find/Replace 面板中打开 Highlight Matches 选项,您会看到您的正则表达式不被视为匹配项。

    查找:

    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. 您的正则表达式中的() 已替换为\(\),这是告诉正则表达式这应该匹配文字( 并且不被视为开始捕获。

    2. .* 更改为 (.*),这意味着“无论出现什么文本,都将其捕获以备后用。

    替换文本是指捕获为\1的文本并将其放回替换中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2021-10-19
      • 2020-06-07
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多