字符串过长时Regex匹配不起作用

Regex match not working when string is too long?

本文关键字:不起作用 Regex 字符串      更新时间:2023-09-26

我有以下字符串:

var example = '{%start%}$MOXDATA${"name":"group one","sections":[{"name":"section one","fields":[{"name":"plain one","type":"plain","value":"// some '"plain'" '''"'"'"'''' ''''  ''    ''  '" '" '" tesP(&^&#37;I&63657riu43r3+_)(I)p;l&gt;:'"&gt;&lt;/&#125;&#125;&#123;|'":1~~``"},{"name":"rich one","type":"rich","value":"<ul>'n<li><span style='"font-size: 11px;'">{ Lo<span style='"font-family: ''comic sans ms'', sans-serif;'">rem</span> ipsu<span style='"color: #ffff00; background-color: #339966;'">m dolor si</span>t amet, consec<strong>tetur adi</strong>piscing elit. Vestibulum ac dolor pulvinar ipsum luctus ullamcorper.</span></li>'n<li></li>'n<li><a href='"http://retrgfd.com/resrgf'">erwfd'"etrgfdd''''refre'"'''"refrds'''"'"'"sdgfd</a></li>'n</ul>"},{"name":"repeater one","type":"repeater","value":[[{"name":"plain one","type":"plain","value":"some test value"},{"name":"rich one","type":"rich","value":"some test value"},{"name":"link one","type":"link","value":"some test value"},{"name":"media one","type":"media","value":"some test value"},{"name":"link two","type":"link","value":"some test value"}]]}]},{"name":"section two","fields":[{"name":"link one","type":"link","value":"<a href='"http://www.yyyy.com'">take me to your leader</a>"}]}]}$MOXDATA${%end%}';

我在做example.match(/{%start%}'$MOXDATA'$(.+)'$MOXDATA'${%end%}/);,它返回null

然而,如果我使用上面字符串的一个明显更短的版本,如:

var shorter = '{%start%}$MOXDATA${"name""}]}]}$MOXDATA${%end%}';
shorter.match(/{%start%}'$MOXDATA'$(.+)'$MOXDATA'${%end%}/);

则CCD_ 3被正确地匹配。

为什么?我做错了什么?

Anony Mousse的回答很好,stribizhev的评论也很好。

然而,当你必须处理一个长字符串时,你应该使用一些能减少回溯的东西([^]*['s'S]*会将所有字符与换行符匹配,直到字符串结束,正则表达式引擎必须逐字符返回,直到找到$MOXDATA${%end%}。这是一项艰巨的工作。)

为了避免这种工作,您可以将[^]*['s'S]*替换为:
[^$]*(?:'$+(?!MOXDATA'${%end%})[^$]*)*

或更健壮(如果$MOXDATA${%end%}不存在):
(?=([^$]*))'1(?=((?:'$+(?!MOXDATA'${%end%})[^$]*)*))'2

(?=(subpattern))'1模拟原子团。)

以这种方式,子模式MOXDATA'${%end%}仅在每个$上进行测试。

默认情况下,.*将不匹配换行

尝试[^]*来真正匹配任何字符。