熟悉正则的朋友都知道,正则的匹配有“贪婪”和“非贪婪”之分。
“贪婪”匹配是尽可能多的匹配:
对于字符串‘aaaa’,
/a+/匹配整个字符串,而非贪婪匹配/a+?/匹配的是整个字符串的第一个‘a’,因为贪婪匹配是尽可能少的匹配。
——————————————
使用非贪婪匹配还有一些需要注意的地方。
考虑下面这个正则表达式:/a+b/,它匹配一个或多个a,以及一个b。
使用‘aaab’作为匹配字符串时,它会匹配整个字符串。
如果我们换成/a+?b/这样的非贪婪模式会怎么样?
我们期望它匹配一个a和最后一个b,相当于在‘aaab’中匹配最后两个字符‘ab’。
但实际上,这个模式匹配了整个字符串,和这个模式的贪婪匹配一样,这是为什么呢?
是因为正则表达式的模式匹配总是会寻找字符串中第一个可能匹配的位置。由于该匹配是从字符串的第一个字符开始的,因此在这里不考虑它的子串中更短的匹配。