Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Regexp-replace函数应该决定不替换匹配的字符串,以便让其他带括号的子匹配字符串使用匹配项_Javascript_Regex_String - Fatal编程技术网

Javascript Regexp-replace函数应该决定不替换匹配的字符串,以便让其他带括号的子匹配字符串使用匹配项

Javascript Regexp-replace函数应该决定不替换匹配的字符串,以便让其他带括号的子匹配字符串使用匹配项,javascript,regex,string,Javascript,Regex,String,这是一个相当简单的示例,我想要的是:如果replace函数决定不替换“匹配”-每隔一个括号中的子匹配字符串:“(“+?”:)”或“([^\s]+?:)”也应该处理此匹配,而不是仅因为第一个子匹配字符串与之匹配而跳过它 简单的例子,请看一下: var fieldNames = [ { displayName: "Sender", systemName: "from_field"}, { displayName: "Receiver(addressee)", systemName:

这是一个相当简单的示例,我想要的是:如果replace函数决定不替换“匹配”-每隔一个括号中的子匹配字符串:“(“+?”:)”或“([^\s]+?:)”也应该处理此匹配,而不是仅因为第一个子匹配字符串与之匹配而跳过它

简单的例子,请看一下:

var fieldNames = [
    { displayName: "Sender", systemName: "from_field"},
    { displayName: "Receiver(addressee)", systemName: "to_field"},
    { displayName: "Author", systemName: "author_id_field"}
];

var query = 'AND (ENTITY(Company),OR(Sender:john, Receiver(addressee):john),OR(#"Receiver(addressee)":Tanaka),OR(#"Abracadabra":Phil)) OR Author:Stan';

// What I want to retrieve as a result:
// 'AND (ENTITY(Company),OR(from_field:john, to_field:john),OR(to_field:Tanaka),OR(#"Abracadabra":Phil)) OR author_id_field:Stan'

// I want to:
// Replace '#"displayName":' with 'systemName:'
// Replace '"displayName":' with 'systemName:'
// Replace 'displayName:' with 'systemName:'
regexp = /(#".+?":)|(".+?":)|([^\s]+?:)/gi;

var newQuery = query.replace(regexp, replaceDisplayName);
console.log('Result:');
console.log(newQuery);

function replaceDisplayName(match, p1, p2, p3) {
    console.log("match: " + match);
    var potentialDisplayName;
    if (p1) {
        // Get the word(s) inside: '#"displayName":' -> get 'displayName'
        potentialDisplayName = match.substring(2, match.length - 2);
    } else if (p2) {
        // Get the word(s) inside: '"displayName":' -> get 'displayName'
        potentialDisplayName = match.substring(1, match.length - 2);
    } else if (p3) {
        // Get the word(s) inside: 'displayName:' -> get 'displayName'
        potentialDisplayName = match.substring(0, match.length - 1);
    }

    console.log('potentialDisplayName: ' + potentialDisplayName);
    var systemName = getFieldNameByDisplayName(potentialDisplayName);
    console.log('found systemName: ' + systemName);

    var newStringValue = systemName ? systemName + ":" : match;
    return newStringValue;
};

function getSystemNameByDisplayName(displayName) {

    for (var i = 0; i < fieldNames.length; i++) {
        if (fieldNames[i].displayName.toLowerCase() === displayName.toLowerCase()) {
            return fieldNames[i].systemName;
        }
    }

    return null;
};
var字段名=[
{displayName:“发件人”,systemName:“发件人字段”},
{displayName:“接收者(收件人)”,systemName:“收件人字段”},
{displayName:“Author”,systemName:“Author\u id\u field”}
];
var query='和(实体(公司),或(发送者:约翰,接收者(收件人):约翰),或(#“接收者(收件人)”:田中),或(#“Abracadabra”:菲尔))或作者:斯坦';
//因此,我要检索的内容:
//'和(实体(公司),或(from_field:john,to_field:john),或(to_field:Tanaka),或(#“Abracadabra”:Phil))或作者_id_field:Stan'
//我想:
//将“#”displayName:”替换为“systemName:”
//将“displayName:”替换为“systemName:”
//将“displayName:”替换为“systemName:”
regexp=/(?“+?”:)(“+?”:)([^\s]+?:)/gi;
var newQuery=query.replace(regexp,replaceDisplayName);
log('Result:');
console.log(newQuery);
函数replaceDisplayName(匹配,p1,p2,p3){
console.log(“匹配:+match”);
var potentialDisplayName;
如果(p1){
//获取内部单词:'#“displayName”:'->获取“displayName”
potentialDisplayName=match.substring(2,match.length-2);
}else if(p2){
//获取“displayName”中的单词:->获取“displayName”
potentialDisplayName=match.substring(1,match.length-2);
}否则,如果(p3){
//获取里面的单词:“displayName:”->获取“displayName”
potentialDisplayName=match.substring(0,match.length-1);
}
log('potentialDisplayName:'+potentialDisplayName);
var systemName=getFieldNameByDisplayName(潜在的DisplayName);
log('found systemName:'+systemName);
var newStringValue=systemName?systemName+:“:匹配;
返回newStringValue;
};
函数getSystemNameByDisplayName(displayName){
对于(变量i=0;i
结果:

和(实体(公司),或(发件人:john, 收件人:约翰),或(#“接收人(收件人)”:田中),或(#“Abracadabra”:菲尔)) 或作者id字段:Stan'

我想要的结果是:

和(实体(公司),或(来源:john, 托菲德:约翰),或(托菲德:田中),或(#“Abracadabra”:Phil))或 作者id字段:Stan'

问题是,例如,第一个匹配将是: “(实体(公司)或(发件人:” 此值不是“displayName”,因此将找不到任何系统名,也不会得到任何替换。但我希望“Sender:”仍然替换为“to_field”。但是,整个匹配将被跳过,因为第一个子匹配字符串“(#“+?”:)”已使用它,因此它不会给其他子匹配字符串提供机会:“(“+?”:)”和“(^\s]+?:)“去处理它


谢谢您的时间,非常感谢您的帮助!

尝试一下。我确实构建了一个从
displayName
systemName
的快速查找,以使用:

var fieldNames = [
        { displayName: "Sender", systemName: "from_field"},
        { displayName: "Receiver(addressee)", systemName: "to_field"},
        { displayName: "Author", systemName: "author_id_field"}
    ],
    regex = /(?:#?"?)([^":]+)(?:"?):/i,
    map = {
        "Sender": "from_field",
        "Receiver(addressee)": "to_field",
        "Author": "author_id_field"
    };

var test = [
    '#"Sender":',
    '"Sender":',
    'Sender:',
    '#"Receiver(addressee)":',
    '"Receiver(addressee)":',
    'Receiver(addressee):',
    '#"Unknown":'
];

for (var i=0; i<test.length; i++) {
    var systemName = test[i].replace(regex, function(match, p1) {
       if (p1) return map[p1] || p1;
    });
    console.log("Display[%s] = System[%s]", test[i], systemName);
}
// output:
// Display[#"Sender":] = System[from_field] 
// Display["Sender":] = System[from_field] 
// Display[Sender:] = System[from_field] 
// Display[#"Receiver(addressee)":] = System[to_field] 
// Display["Receiver(addressee)":] = System[to_field] 
// Display[Receiver(addressee):] = System[to_field]
// Display[#"Unknown":] = System[Unknown] 
var字段名=[
{displayName:“发件人”,systemName:“发件人字段”},
{displayName:“接收者(收件人)”,systemName:“收件人字段”},
{displayName:“Author”,systemName:“Author\u id\u field”}
],
正则表达式=/(?:#?“?)([^:]+)(?:“?):/i,
地图={
“发件人”:“发件人字段”,
“收件人:”收件人字段“,
“Author”:“Author\u id\u字段”
};
var测试=[
“#”发送者“:”,
“发件人”:,
“发件人:”,
""收件人(收件人):",,
“收件人”:,
“接收人(收件人):”,
“#”未知“:
];
对于(var i=0;i