带有正则表达式的Javascript以不同的特定字符分割字符串
我有以下字符串带有正则表达式的Javascript以不同的特定字符分割字符串,javascript,regex,Javascript,Regex,我有以下字符串 Name=(Last, First), Age=(31 year, 6 months, 3 day), Height= 6.1 ft, Employment=None, Email Address =/NA/, Mobile=XXXX 我想把它们分成以下几部分来建立一个字典 Name: "(Last, First)" Age: "(31 year, 6 months, 3 day)" Height: " 6.1 ft" ... 我偶然发现并尝试调整它,但可以让它与键一起工作,
Name=(Last, First), Age=(31 year, 6 months, 3 day), Height= 6.1 ft, Employment=None, Email Address =/NA/, Mobile=XXXX
我想把它们分成以下几部分来建立一个字典
Name: "(Last, First)"
Age: "(31 year, 6 months, 3 day)"
Height: " 6.1 ft"
...
我偶然发现并尝试调整它,但可以让它与键一起工作,而不带“()”。这是代码。将感谢您的帮助,并随时建议更简单或替代的方式
txt=“姓名=(最后一位,第一位),年龄=(31岁,6个月,3天),身高=6.1英尺,工作=无,电子邮件地址=/NA/,手机=XXXX”
//var r=/.+?=.+?(?=(\([^)]+\),)(.=)$)/g;
//变量r=/.+?=.+?(?=(=(*))|$)/g;
var r=/.+?=.+(?=(\),)|(\d\b,)|$)/g;
var obj=txt.match(r).reduce(函数(obj,match){
var keyValue=match.split(“”);
obj[keyValue[0]。替换(/,\s/g',)]=keyValue[1];
返回obj;
}, {});
控制台日志(obj)代码>要匹配属性和值,可以使用:
(\w+)\s*=\s*(\([^)]+\)|[^,]+)
(\w+)
-匹配并捕获属性(一个或多个单词字符)
\s*=\s*
-后跟可选空格、a=
和更多可选空格
(\([^)]+\)\[^,]+)
-匹配并捕获以下任一项:
\([^]+\)
-A(
,后跟非)
字符,后跟)
,或
[^,]+
-非逗号字符
const str='Name=(最后一个,第一个),年龄=(31岁,6个月,3天),身高=6.1英尺,就业=无,电子邮件地址=/NA/,手机=XXXX';
常量obj={};
对于(str.matchAll(/(\w+)\s*=\s*(\([^)]+\)\124;[^,]+)/g)的常量[,属性,值]){
obj[prop]=val;
}
控制台日志(obj)代码>这里有一种方法,使用智能前瞻只在正确的逗号上有条件地拆分:
var txt=“姓名=(最后一位,第一位),年龄=(31岁,6个月,3天),身高=6.1英尺,就业=无,电子邮件地址=/NA/,手机=XXXX”
var-map={};
var parts=txt.split(/,\s*(?![^(]*\)/);
部分。forEach(功能(项目、索引){
映射[item.split(/=/)[0]]=item.split(/=/)[1];
});
控制台日志(map)代码>非常好。感谢您花时间解释正则表达式语法。一个小提示是,如果关键字是“员工姓名”这样的多个单词,它只会选择“姓名”。我把它改成了/\w++\s*\w++\s*=\s*(\([^)]++\)\124;[^,]+)
,它工作了(和(\w++\s*\w+
一样)。你解释了之后就容易多了。但是,我不确定(\w+)\
中的括号是用来做什么的?如果“键”可以包含空格,我想您可以匹配任何东西,而不是=
而不是\w+
。括号捕获部分括号-它们被称为捕获组,它们允许您在Javascript中提取外部的子匹配项-括号中匹配的键部分进入prop
变量,因为它是第一个捕获组。抱歉,我不知道如何匹配,但使用了=
而不是\w+
。似乎我所做的更改是不必要的,但不确定如何捕获=
之前的所有内容。若要匹配=
以外的任何内容,请使用负数字符集,[^=]
,请参见代码段。这很好,而且更容易理解。谢谢你的帮助,我接受了你的帮助。我得到了两个很好的答案和很好的解释。如果在正确的逗号处进行拆分(例如,在括号内进一步拆分),您的代码更容易理解,并提供了更大的灵活性。