高级正则表达式 - 设置全局修饰符时仅匹配文件的第一次出现

Advanced regex - match only the first occurence of a file when global modifier set

在我的编辑器中,我尝试在很多文件上放置一个正则表达式,这样如果它找到 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 替换第一次出现的 $。我在编辑器中使用替换实用程序。最后的结果应该是这样的。

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

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

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

编辑:如果你不能关闭全局标志,匹配一切从第一个$开始:

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

试试这个正则表达式:

^([^$]*)(?=$)

Click for Demo

解释:

  • ^ - 断言字符串的开始
  • [^$]* - 匹配出现次数超过 0 次的任何非 $ 的字符。括号是组中的这部分。稍后,该组中捕获的任何内容都将被该组的内容以及行 const $ = require('jquery');\n 替换,如演示中所示。
  • (?=$) - 正面前瞻以验证直到现在匹配的任何内容后跟 $