我对正则表达式不太满意,需要一些帮助。
我有一个类似于以下内容的字符串:
[{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'}
我理解为什么这个字符串是匹配的。我不明白为什么没有其他字符串匹配。我期望其他匹配的字符串是:
{type ='cost',field ='flag& e band 100s($ 1 / M's)',value ='680'},
{type ='cost',field = '29 versions',value ='250'}
为什么不进行这些比赛?
答案 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.之后的额外'
所以我建议(如果你也想收集字段的内容):
否则,仅在大括号分组上触发,即\{[^\}]+\}
答案 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),给我所有以{,有一个或多个非}字符开头并以}结尾的内容。