[英]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(&^%I&63657riu43r3+_)(I)p;l>:\"></}}{|\":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.