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