【问题标题】:Javascript regex extract with variable带有变量的Javascript正则表达式提取
【发布时间】:2018-03-12 22:37:50
【问题描述】:

我想从下面的键中提取值:值对作为单个字符串发送:

"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.log("Matched " + node + " with node field ");
	}

【问题讨论】:

  • 用逗号分割,再用冒号分割?
  • 由于正则表达式无法处理变量——这是什么意思?
  • 好的,所以我提供的示例字符串可能没有对我实际处理的内容做出判断...... xrandom1:xkey1,xrandom2:ykey2,var1:value1,xrandom3:xkey3 yrandom1: ykey1,yrandom2:ykey2,var2:value2,rxandom3:ykey3 如果 var1 存在,我只对 value1 感兴趣......它可能根本不存在......关于正则表达式无法处理变量的评论,即由于“提取” ',我不得不使用不支持变量的 ?:xyz: 参数......或者如果我使用数组变量来替换,至少不起作用

标签: javascript arrays regex


【解决方案1】:

使用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.log(object);

【讨论】:

    【解决方案2】:

    您低估了 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.log(valueOf('host'));
    console.log(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-test,region:us-west-2,snow_sg:aws_cloud 在那里我只想如果字符串中存在标签“host”,则捕获“identity01.auth-test”。
    • 正如我在您的问题str.match(/host:([^,]+)/)[1] 中看到的那样,您做得对。你的主要问题是什么? @DragonYoon
    【解决方案3】:

    您可以使用正则表达式 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.log(obj);

    【讨论】:

      【解决方案4】:

      编辑 - 按照 vasan 的建议删除我的答案,我们需要在键和值周围加上引号。与其添加引号然后解析,不如使用 split 函数将其拆分。所以 SimpleJ 的答案应该有效。

      【讨论】:

      • 你运行过这个吗?它行不通。您还需要在所有键和值周围加上引号。非常hacky。
      猜你喜欢
      • 2012-07-07
      • 2013-07-25
      • 2014-01-27
      • 2015-03-02
      • 1970-01-01
      • 2021-07-05
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多