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'"