帮助正则表达式

时间:2011-07-29 16:21:30

标签: javascript regex regex-greedy

我对正则表达式不太满意,需要一些帮助。

我有一个类似于以下内容的字符串:

[{type='(type here)', field='(field here)', value='(value here)'},{...},...,{...}]

我正在尝试将其与以下正则表达式匹配:

^\[(\{type=\'(.*)\', field=\'(.*)\', value=\'(.*)\'\},*)*\]$

但它不匹配。然后我调试了。这是我用于调试的正则表达式:

\[(\{(.*)\}\]

这是字符串:

[{type='cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost', field='29 versions', value='250'}]

以下是比赛:

{type ='cost',field ='flag& e band 100s($ 1 / M's)',value ='680'},{type ='cost',field = '29 versions',value ='250'}

我理解为什么这个字符串是匹配的。我不明白为什么没有其他字符串匹配。我期望其他匹配的字符串是:

  1. {type ='cost',field ='flag& e band 100s($ 1 / M's)',value ='680'},

  2. {type ='cost',field = '29 versions',value ='250'}

  3. 为什么不进行这些比赛?

4 个答案:

答案 0 :(得分:0)

这有用吗:

^ matches at the start of the string
\[ matches "["
(
    \{type=\' matches "{type='"
    (
        .* matches "cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost"
    ) captures "cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost"
    \', field=\' matches ', field='
    (
        .* matches "29 versions"
    ) captures "29 versions"
    \', value=\' matches "', value='"
    (
        .* matches "250"
    ) captures "250"
    \'\} matches "'}"
    ,* matches ""
)* captures "{type='cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost', field='29 versions', value='250'}" (first and only repeat)
\] matches "]"
$ matches at the end of the string

因此,第1组捕获“[”和“]”之间的所有内容。

答案 1 :(得分:0)

你可能正在使用贪婪的量词,而不是懒惰的量词。在每个?之后插入*,看看是否有任何修复。

答案 2 :(得分:0)

问题是在子组中使用.*type=\'(.*)\'贪婪地匹配,即它会产生cost', field='flag & e band 100s ($1/M's)', value='680'}, {type='cost

此外:您的数据中的分隔符也会出现在内容中,例如:你的模式试图解析field=\'(.*)\',但很难点击field='flag & e band 100s ($1/M's)',(注意M.之后的额外'

所以我建议(如果你也想收集字段的内容):

  1. 观察“字段”的可能内容,以屏蔽子分组(如果数据来自外部源,则转义或查找更好的分隔符)。
  2. 像史蒂夫·王在答案中提到的那样避免贪婪,只是按照预期收集子群。
  3. 否则,仅在大括号分组上触发,即\{[^\}]+\}

答案 3 :(得分:0)

这应该这样做:

    var str = "[{type='cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost', field='29 versions', value='250'}] ";
    var regexp = /\{[^\}]+\}/g;
    var m;
    while (m = regexp.exec(str)) {
        alert(m[0]);
    }

表达式绝对不必太复杂 - /\{[^\}]+\}/g表示:

全局,(收尾正斜线后的g),给我所有以{,有一个或多个非}字符开头并以}结尾的内容。