Javascript 用RegExp替换先前替换的字符串中的单词

Javascript 用RegExp替换先前替换的字符串中的单词,javascript,jquery,Javascript,Jquery,我有以下代码将字符串添加到数组中: sql = new Array(); query = "SELECT * FROM specimen"; $('#keyword').change(function(){ filter = " MATCH(clinical_history) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(specimen) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(macr

我有以下代码将字符串添加到数组中:

sql = new Array();

query = "SELECT * FROM specimen";

$('#keyword').change(function(){

filter = " MATCH(clinical_history) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(specimen) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(macroscopic) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(microscopic) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(conclusion) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(comment) AGAINST ('_KEYWORD_' IN BOOLEAN MODE)";

sql.push(filter);

});
然后,我将用输入字段的值替换上面字符串中的
\u关键字
占位符:

$('#search_container').on('click', '#search_btn', function(){

keyword = $('#keyword_field').val();

var regExp = new RegExp('_KEYWORD_', 'g');    
$.each(sql, function(index, value) {
    sql[index] = value.replace(regExp, keyword);


if(sql != ''){
query += " WHERE " + sql.join('  AND ');
}

});
现在,它可以正常工作一次,但当输入值替换了
\u关键字
占位符时就不行了。我需要做的是确定最后一个输入值,并在替换代码中使用它


有什么办法吗?

最后一个输入值在字符串中可能不是唯一的。它很可能与sql查询中的其他单词相同。试图这样做既困难又不能保证100%可靠

我建议您在进行任何替换之前单独保存原始模板字符串,以便始终保留原始模板字符串。然后,每次都可以用相同的方法进行替换。简单,100%可靠

构造这种结构的一种方法是使sql数组的每个元素都是一个具有两个属性的对象,即模板字符串和转换/替换的字符串。那么,你将永远拥有这两者

var sql = [];

$('#keyword').change(function(){
    var obj = {};
    obj.filter = " MATCH(clinical_history) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(specimen) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(macroscopic) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(microscopic) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(conclusion) AGAINST ('_KEYWORD_' IN BOOLEAN MODE) OR MATCH(comment) AGAINST ('_KEYWORD_' IN BOOLEAN MODE)";
    sql.push(obj);
});

$('#search_container').on('click', '#search_btn', function(){
    var keyword = $('#keyword_field').val();
    var regExp = new RegExp('_KEYWORD_', 'g');    
    $.each(sql, function(index, value) {
        // store the replacement string as the .replaced property
        // so the .filter property remains unchanged and can be used 
        // again in the future
        sql[index].replaced = sql[index].filter.replace(regExp, keyword);
    });

    if (sql.length) {
        var q = $.map(sql, function(elem) {
            return elem.replaced;
        });
        query += " WHERE " + q.join('  AND ');
    }
});

此外,这可能会导致问题,如果给定的关键字为“MATCH”,则当您再次尝试替换它时,字符串其他部分中的匹配项将得到replacedYep,顺序粘贴错误,现在已在OP中更新。匹配查询中的占位符下划线应且正在更改为相同的值,这正是我想要的。代码从样本中选择*,在样本中[object object]我添加了更多的代码,以使它更清楚我是什么doing@PeterBrowne-您是否100%确定您实现了我建议的代码,然后使用
sql[index]。在需要实际查询的任何位置替换了
版本的字符串<代码>[object object]
让我觉得您引用的是一个对象,而不是该对象上的属性。@PeterBrowne-您的其他代码没有正确使用新的数组格式。我更新了代码,将您添加到问题中的新部分包括在内。这里要认识到的重要一点是,
sql
是一个对象数组。它不是一个字符串数组。你不能像以前那样只使用
.join()
对象数组。是的,最后一点就成功了。非常感谢您的专业知识!