text = <<TEXT asdf <!-- OPTIONAL : State school colours, using words, then <br>then {{colorbox|#xxyyzz}} TEXT text =~ /<!--(.|\s)*?-->/
一运行就 hang 在那了 1.9.3 2.0.0 都有问题,1.8.7 貌似没事儿
改成这样就好了:
text =~ /<!--.*?-->/m
注:并没有死循环,不过匹配的复杂度 NP 了
注:在多行模式里 (m = multiline), .
可以匹配换行符和空格
呃... 是 n power 不是 nondeterministic polynomial problem...
例子可以简化如下 (是否贪婪对是否卡住没影响...):
'-' + ' ' * 41 =~ /-(.|\s)*-/
注意正则最后还要匹配 -
, 必须要回溯。选择支的两边 .
和 \s
都匹配空格,所以都在回溯的范围中,这个字符串中有 41 个空格,回溯的深度达到了 41, 要做 2 ** 41 次匹配,于是就 N Power 了 (n 为字符串长度). (这里略过了不少细节... 如果你按照正则的逻辑自己写一个这样的 parser 就会明白了...)
括号里如果用原子组 (?>)
的话,也能避免不必要的回溯:
text =~ /<!--(?>.|\s)*?-->/
还有个修正方法是让选择支两边没有交集:
text =~ /<!--(.|\n)*?-->/
Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems.