Извлечение регулярного выражения javascript с переменной

Я хотел бы извлечь значения из следующих пар ключ: значение, отправляемых в виде одной строки:

"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 ");
	}

Разделить запятыми, а потом разделить двоеточиями?

user47589 12.03.2018 23:39
из-за того, что регулярное выражение не может обрабатывать переменные - что это значит?
Pointy 12.03.2018 23:42

Хорошо, пусть приведенный мной образец строки не оценивает то, с чем я на самом деле имею дело .... xrandom1: xkey1, xrandom2: ykey2, var1: value1, xrandom3: xkey3 yrandom1: ykey1, yrandom2: ykey2, var2: value2, rxandom3: ykey3 И меня интересует только value1, если существует var1 ... он может вообще не существовать ... комментарий о том, что регулярное выражение не может обрабатывать переменные, т.е. из-за «извлечения» мне пришлось использовать? : xyz: аргумент, который не поддерживает переменные ... или, по крайней мере, не работает, если я использую переменную массива для замены

Dragon Yoon 12.03.2018 23:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
825
4

Ответы 4

Используйте 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 совершенно разные ... Я просто упомянул их в качестве примера ... на самом деле это будут совершенно разные строки ...

Dragon Yoon 12.03.2018 23:53

их нет, это фактические теги ресурсов AWS ... это может быть loadbalancername или autoscale_group и т. д., т.е. нет шаблона ...

Dragon Yoon 12.03.2018 23:55

Итак, у вас есть несколько пар key:value в одной строке ввода, каждый ключ и соответствующее значение которой вы хотите записать? @DragonYoon

revo 12.03.2018 23:56

Да, вот реальный пример: 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 ".

Dragon Yoon 12.03.2018 23:59

Вы делаете это правильно, как я вижу в вашем вопросе str.match(/host:([^,]+)/)[1]. Какая у вас основная проблема? @DragonYoon

revo 13.03.2018 00:02

Я надеялся, что мне не придется повторять код таким образом ... вместо этого я хотел сохранить все «ключи» в виде массива и выполнить цикл через назначение ... Обратите внимание, что эта функция будет обрабатывать строку, которая будет соответствовать только одному из var1 или var2 / 3 и т.д. в любой момент ... У меня 123 типа :( так что это 123 оператора if / else ... это не может быть правильным, я не знаком с JS, но на других языках Я бы не мечтал об этом ...

Dragon Yoon 13.03.2018 00:04

В ответ добавлена ​​живая демонстрация. @DragonYoon

revo 13.03.2018 00:17

Изменить - удалив мой ответ, как это было предложено vasan, нам нужны кавычки вокруг ключа и значений. Вместо добавления кавычек и последующего анализа будет лучше просто разделить его с помощью функции разделения. Итак, ответ SimpleJ должен работать.

Вы запускали это? Это не сработает. Вам также необходимо заключить в кавычки все ключи и значения. Очень хакерский.

Vasan 12.03.2018 23:57

Другие вопросы по теме