正则表达式:/+{3}/s{4}COMPANY(.|/s)*-{3}/s{4}END
match匹配下面这段字符串可以,
+++ COMPANY 2009-06-06 20:54:02
O&M CMD = COMMAND
SDFL= 2K
--- END
+++ COMPANY 2009-06-06 20:54:02
+++ COMPANY 2009-06-06 20:54:02
O&M CMD = COMMAND
SDFL=3K
--- END
但是,匹配下面这段就出问题了,使用match匹配无法退出,CPU占有率100%
+++ COMPANY 2009-06-06 20:54:02
O&M CMD = COMMAND
SDFL= 2K
--- END
+++ COMPANY 2009-06-06 20:54:02
+++ COMPANY 2009-06-06 20:54:02
O&M CMD = COMMAND
SDFL=3K
========================================
另外,使用 正则表达式:(/+{3}/s{4}COMPANY(.|/s)*-{3}/s{4}END)?
是无法进行最小匹配,即非贪婪匹配的。
上面的正则表达式是贪婪的,/+{3}/s{4}COMPANY(.|/s)*-{3}/s{4}END ,(.|/s)*会进行贪婪的、尽可能多的匹配。(但上面第二个字符串仍有满足条件的字串,即便进行贪婪匹配,但也不至于无法退出啊,CPU占有100%?这一点一直没有想明白)。
解决之道:
把上面的正则表达式改成非贪婪匹配就可以了,/+{3}/s{4}COMPANY(.|/s)*? -{3}/s{4}END,
通过使用?来让re引擎尽可能少的进行匹配。
转自:http://blog.csdn.net/oldsmith/article/details/4248217