Я хотел бы извлечь значения из следующих пар ключ: значение, отправляемых в виде одной строки:
"var1:value1,var2:value2,var3:value3"
Мне нужно использовать JavaScript, и, к сожалению, я не могу использовать массив и цикл через ключи var1, var2, var3 из-за того, что регулярное выражение не может обрабатывать переменные ... Мне интересно, есть ли способ сделать это в JS?
См. ниже:
function onBefore(current, previous)
{
if (current.key != '' || current.key != null)
{
if (current.key.match(/var1/)) {
var assign = current.key.match(/(?:var1:)([^,]+)/)[1];
} else if (current.key.match(/var2/)) {
var assign = current.key.match(/(?:var2:)([^,]+)/)[1];
} else if (current.key.match(/var3/)) {
var assign = current.key.match(/(?:var3:)([^,]+)/)[1];
} else if (current.key.match(/var4/)) {
var assign = current.key.match(/(?:var4:)([^,]+)/)[1];
}
} else {
assign = "None";
}
if (assign != "None") {
current.node = assign;
}
}
}
@revo спасибо за этот ответ, другим будет полезно ... вот последний код:
var str = "keyIcareabout:test3end,something:value,nothing:burger";
var node = "None";
function valueOf(key) {
return (m = (new RegExp("\\b" + key + ":([^,]+)")).exec(str)) !== null ? m[1] : null;
}
if (str != '' || str !== null)
{
var resources = ["keyIcareabout","somethingelseIcareabout"];
for (i = 0; i < resources.length; i++)
{
if (str.match(resources[i]))
{
node = valueOf(resources[i]);
}
}
}
if (node != "None")
{
console.info("Matched " + node + " with node field ");
}Хорошо, пусть приведенный мной образец строки не оценивает то, с чем я на самом деле имею дело .... xrandom1: xkey1, xrandom2: ykey2, var1: value1, xrandom3: xkey3 yrandom1: ykey1, yrandom2: ykey2, var2: value2, rxandom3: ykey3 И меня интересует только value1, если существует var1 ... он может вообще не существовать ... комментарий о том, что регулярное выражение не может обрабатывать переменные, т.е. из-за «извлечения» мне пришлось использовать? : xyz: аргумент, который не поддерживает переменные ... или, по крайней мере, не работает, если я использую переменную массива для замены



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте String.split:
const data = 'var1:value1,var2:value2,var3:value3';
const pairStrings = data.split(/,/g);
const pairs = pairStrings.map(pairString => pairString.split(/:/));
const object = pairs.reduce((object, [key, value]) => {
object[key] = value;
return object;
}, {});
console.info(object);Вы можете использовать регулярное выражение RegExp.exec() для циклического перебора совпадений пар ключ / значение и извлечения ключа и значения в объект (или массив):
var str = 'var1:value1,var2:value2,var3:value3';
var pattern = /([^:,]+):([^,]+)/g;
var obj = {};
var temp;
while(temp = pattern.exec(str)) {
obj[temp[1]] = temp[2];
}
console.info(obj);Вы недооценили RegEx. Вся ваша функция может быть сокращена до этого:
function valueOf(key) {
return (m = (new RegExp("\\b" + key + ":([^,]+)")).exec(str)) !== null ? m[1] : null;
}
Вам не нужно проверять каждый ключ отдельно в условии if. Передайте key в указанную выше функцию valueOf(), чтобы получить значение.
var str = "aws_acnt_name:test,aws_acnt_num:1234," +
"host:identity01.auth-test,region:us-west-2,snow_sg:aws_cloud";
function valueOf(key) {
return (m = (new RegExp("\\b" + key + ":([^,]+)")).exec(str)) !== null ? m[1] : null;
}
console.info(valueOf('host'));
console.info(valueOf('aws_acnt_name'));К сожалению, на самом деле var1, var2, var3 совершенно разные ... Я просто упомянул их в качестве примера ... на самом деле это будут совершенно разные строки ...
их нет, это фактические теги ресурсов AWS ... это может быть loadbalancername или autoscale_group и т. д., т.е. нет шаблона ...
Итак, у вас есть несколько пар key:value в одной строке ввода, каждый ключ и соответствующее значение которой вы хотите записать? @DragonYoon
Да, вот реальный пример: aws_acnt_name: test, aws_acnt_num: 1234, host: identity01.auth-te st, region: us-west-2, snow_sg: aws_cloud Здесь я хочу только записать «identity01. auth-test "если в строке есть тег" host ".
Вы делаете это правильно, как я вижу в вашем вопросе str.match(/host:([^,]+)/)[1]. Какая у вас основная проблема? @DragonYoon
Я надеялся, что мне не придется повторять код таким образом ... вместо этого я хотел сохранить все «ключи» в виде массива и выполнить цикл через назначение ... Обратите внимание, что эта функция будет обрабатывать строку, которая будет соответствовать только одному из var1 или var2 / 3 и т.д. в любой момент ... У меня 123 типа :( так что это 123 оператора if / else ... это не может быть правильным, я не знаком с JS, но на других языках Я бы не мечтал об этом ...
В ответ добавлена живая демонстрация. @DragonYoon
Изменить - удалив мой ответ, как это было предложено vasan, нам нужны кавычки вокруг ключа и значений. Вместо добавления кавычек и последующего анализа будет лучше просто разделить его с помощью функции разделения. Итак, ответ SimpleJ должен работать.
Вы запускали это? Это не сработает. Вам также необходимо заключить в кавычки все ключи и значения. Очень хакерский.
Разделить запятыми, а потом разделить двоеточиями?