高级正则表达式 - 仅在全局修改器设置时匹配文件的第一个出现

时间:2017-10-05 16:38:27

标签: regex regex-lookarounds

在我的编辑器中,我尝试在许多文件上放置一个正则表达式,这样如果它找到jquery美元函数$,它会使juqery函数加载const $ = require('jquery');

所以基本上,如果我有这样的文件:

$(document).ready(function () {
    $('.btn-toggle-achievement').on('click', function (e) {
        var button = e.target;
        var el = $(button);
        $.post('/achievements_ajax/toggle_achievement', {
            status: el.data('enable'),
            achievement_id: el.data('achievement-id')
        });
    });
});

我想编写一个正则表达式来替换$const $ = require('jquery');\n的第一次出现。我在编辑器中使用了replace实用程序。最终结果应该是这样的。

const $ = require('jquery');
$(document).ready(function () {
    $('.btn-toggle-achievement').on('click', function (e) {
        var button = e.target;
        var el = $(button);
        $.post('/achievements_ajax/toggle_achievement', {
            status: el.data('enable'),
            achievement_id: el.data('achievement-id')
        });
    });
});

这是我到目前为止所得到的: https://regex101.com/r/ooHn9H/1

但此时它取代$的任何出现。我只想替换第一个。我可以确保正则表达式只匹配第一次出现吗?也许我需要一个负面的lookbehind来检查之前是否已匹配$

2 个答案:

答案 0 :(得分:3)

在正则表达式中,您设置了全局标志,这意味着它将替换每次出现。关闭全局标志,你就会得到你想要的东西。

编辑:如果您无法关闭全局标记,请匹配第一个$ on上的所有内容

(\$(?:.|[\r\n\u2028\u2029])*)

答案 1 :(得分:2)

试试这个正则表达式:

[^$]*

Click for Demo

<强>解释

  • $ - 断言String的开头
  • const $ = require('jquery');\n - 匹配任何不是(?=\$)的字符的出现次数。括号是该组中的这一部分。稍后,此组中捕获的任何内容都将被此组的内容以及演示中显示的行$替换。
  • MyCustomMigrationPolicy - 用于验证目前匹配的内容的正面预测后跟My_App_Name.MyCustomMigrationPolicy