Javascript 对键值对进行复杂的正则表达式解析
我花了一个多小时处理正则表达式模式,以便在复杂字符串上找到并替换一个正常工作的Javascript 对键值对进行复杂的正则表达式解析,javascript,regex,Javascript,Regex,我花了一个多小时处理正则表达式模式,以便在复杂字符串上找到并替换一个正常工作的 我需要转换如下字符串: foo a='b' c="d and e" wombat=true a fizz='buzz' "hello='goodbye'" 并将其标准化为: foo "a='b'" "c='d and e'" "wombat='true'" a "fizz='buzz'" "hello='goodbye'" 实质上: 每个键/值对都应该用双引号括起来,值用单引号括起来,不管它们以前是如何包装的
我需要转换如下字符串:
foo a='b' c="d and e" wombat=true a fizz='buzz' "hello='goodbye'"
并将其标准化为:
foo "a='b'" "c='d and e'" "wombat='true'" a "fizz='buzz'" "hello='goodbye'"
实质上:
- 每个
键/值
对都应该用双引号括起来,值用单引号括起来,不管它们以前是如何包装的
- 多行间距的值必须先用单引号或双引号括起来,才能作为值“包含”
到目前为止,我使用的正则表达式的顺序如下:
str = str.replace(/([a-zA-Z0-9]*)=("(.*?)"|'(.*?)')/g, '"$1=\'$2\'');
然而,这有很多问题
是否有任何单一的替换解决方案?替换
/(['"]?)(\w+)=(?:(['"])((?:(?!\3).)*)\3|(\S+))\1/g
与
通缉犯
foo "a='b'" "c='d and e'" "wombat='true'" a "fizz='buzz'" "hello='goodbye'"
表达式分解如下:
(['"]?) # group 1: either single or double quote, optional
(\w+) # group 2: word characters (i.e. the "key")
= # a literal "="
(?: # non-capturing group
(['"]) # group 3: either single or double quote
( # group 4 (quoted value):
(?:(?!\3).)* # any character that's not the same as group 3
) # end group 4
\3 # the quote from group 3
| # or...
(\S+) # group 5 (non-quoted value, no spaces)
) # end non-capturing group
\1 # whatever group 1 had, for good measure
以下正则表达式将满足您的要求:
"?(\w+)='?([\w]+)'?"?|"?(\w+)="([\w\s]+)""?
替换为:
"$1$3='$2$4'"
为什么a
在fizz
之前的true
之后的a
在foo a='b'c=“d and e”wombat=true a fizz='buzz'“hello='bye'”
中不被视为值?@guest271314“一个多行间距的值必须在前面用单引号或双引号括起来,才能作为一个值“包括进去”。谢谢。)我还添加了表达式的分解。@d请注意,如果值可以包含换行符,则需要将
更改为[\s\s]
。这也是一个想法,但不考虑单引号中的间隔值。是的,没有考虑到这一点。但是regex可以很容易地进行修改。
"$1$3='$2$4'"