【问题标题】:passing a variable to map & replace将变量传递给映射和替换
【发布时间】:2014-03-08 06:17:03
【问题描述】:

我正在尝试“清理”一个看起来像这样的文本字符串:

DATABASE:madsat NL:Show all platforms of Salute generated from NAIs with no go mobility.

清理后的字符串应如下所示:

Show all platforms of Salute generated from NAIs with no go mobility.

我正在尝试下面的代码,但是当我传入一个变量时,它似乎不喜欢它,因为字符串返回原样:

$(document).ready(function(){
    $.get('inputQueryExamples.txt',function(data){
        var queryString = data;
        var cleanString = "";
        var db = '';
        $('#database-list').change(function(){
            db = $('#database-list').val();

            // /(^DATABASE:.*\r\n)(^NL.*)/gm
            // http://regex101.com/r/mN4hS2

            regex = new RegExp('(^DATABASE:'+ db +'\r\n)(^NL.*)' ,'gm');

            console.log(db);
            console.log(regex);
            //put code in here to replace un-needed stuff
            $('#what').append(regex + '<br>');

            cleanString = queryString.match(regex);

            var nlString = cleanString.map(function(el) {return el.replace('DATABASE:' + db + ' NL:','');});

            for (i=0; i<nlString.length; i++){
                $('#what').append(nlString[i]+'<br>');
            }
        }); // end change

任何对我做错了什么的见解将不胜感激。谢谢

【问题讨论】:

    标签: javascript jquery function map replace


    【解决方案1】:

    所以这行得通,但我不知道为什么我必须处理字符串两次。谁能解释一下?

    var nlString = cleanString.map(function(el) {return el.replace('DATABASE:' + db,'');});
    nlString = nlString.map(function(el){return el.replace('NL:',''); });
    

    【讨论】:

    • 您在这里尝试做两件不同的事情。用于查找您想要的部分的正则表达式将您不想要的“DATABASE:”和“NL:”标签、换行符和您想要保留的内容组合在一起。然后你的下一个 pass 想要将主要内容与其他内容分开。使用单个正则表达式会很困难。请参阅我的更新解决方案以获取替代方案。
    【解决方案2】:

    这样的?

    var s = "DATABASE:madsat \r\nNL:Show all platforms of Salute generated from NAIs with no go mobility.";
    var db = "madsat";
    var r = new RegExp('(^DATABASE:'+ db + '[\\s\\r\\n]*)(^NL:)' ,'gm');
    s1.replace(r, "");
    //=> "Show all platforms of Salute generated from NAIs with no go mobility."
    

    更新

    您尝试做的事情需要一段时间才能深入了解(并且您的示例数据完全隐藏在该 regex101 链接中。)

    但我认为这 JSBin 与您想要做的很接近:它仍然会执行一次查找匹配项,然后执行第二次处理以删除该匹配项中不需要的部分。但第二遍由单个正则表达式 replace 调用处理,而不是上面的双 replaces。 (点击“Run with JS”按钮,在框中输入“madsat”或“geoquery”。)

    这是相关代码:

    $(document).ready(function() {
        $.ajax('http://jsbin.com/fase/1.js', {dataType:'text'}).done(function(data){
            var $what = $("#what");
            $('#database-list').change(function(){
                var db = $(this).val(),
                    base = '(^DATABASE:'+ db + '[\\s\\r\\n]*)(^NL:)';
                var regex1 = new RegExp(base + '(.*)' ,'gm');
                var regex2 = new RegExp(base, 'gm');
                (data.match(regex1) || []).map(function(str) {
                    return str.replace(regex2, "");
                }).forEach(function(query) {
                    $what.append(query + "<br/>");
                });
            });
        });
    });
    

    请注意,这两个正则表达式是相同的,只是第一个匹配“NL:”行的其余部分,而第二个不匹配。

    【讨论】:

    • 谢谢。我走了一条不同的路,但我相信这也会奏效。你知道为什么我的解决方案有效,两次处理数组元素而不是我最初尝试的方式吗?
    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多