簡體   English   中英

字符串太長時,正則表達式匹配不起作用?

[英]Regex match not working when string is too long?

我有以下字符串:

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%}/);

{"name""}]}]}然后正確匹配。

這是為什么? 我究竟做錯了什么?

Anony-Mousse的回答很好,同時也給了stribizhev評論。

但是,當您必須處理長字符串時,應使用減少回溯的方法( [^]*[\\s\\S]*將使所有字符都換行,直到字符串的末尾和正則表達式引擎必須逐個字符地返回,直到找到$MOXDATA${%end%} 。這是很多工作。)

為了避免這項工作,您可以將[^]*[\\s\\S]*替換為:
[^$]*(?:\\$+(?!MOXDATA\\${%end%})[^$]*)*

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

(?=(subpattern))\\1模擬一個原子團 。)

這樣,子模式MOXDATA\\${%end%}僅在每個$上進行測試。

默認情況下, .*將不匹配換行符

嘗試[^]*匹配任何字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM