[size=medium]正则表达式中的量词是用来指定匹配中某些组或字符允许出现的次数。在当前Pattern API下有三种量词,即:贪婪、勉强、侵占。
贪婪量词有六种表现形式:x?、x*、x+、x{n}、x{n,}、x{n,m}。在匹配的时候它让匹配器直接读入(也可以说成是吃掉)整个输入的字符串,从而来尝试第一匹配。如果在第一次匹配没有成功的话它将会从字符串的右边回退(吐出)一个字符再进行尝试,就这样不断的进行尝试直到找到所有匹配或者是没有匹配为止。
表达式以.*foo为例,输入字符xfooxxxxxfoo为例,其步骤如下图:
xfooxxxxxfoo -> [u]xfooxxxxxfoo[/u] -> [u]xfooxxxxx[/u]foo
在这个测试中贪婪量词首先吃掉整个xfooxxxxxfoo字符串。因为最后的“foo”已经被消耗掉,所以匹配不会成功。然后匹配器会从右边起吐出“o”,再尝试匹配,直到右边吐出foo时,达到了满足了匹配器,完成匹配。此时消耗掉了整个字符串,匹配结束。
勉强量词有六种表现形式:x??、x*?、x+?、x{n}?、x{n,}?、x{n,m}?。元字符表示的是所指定的字符或组出现零次或一次。在匹配时它的机制与贪婪是相反的。它是从输入字符串的开始处吃掉一个字符来尝试匹配。当找到匹配时就消耗掉已成功匹配的字符串,然后继续开始一个一个吞噬再次查找匹配。无论是否找到匹配,它都会尝试整个输入的字符串。
表达式以.*?foo为例,输入字符xfooxxxxxfoo为例,其步骤如下图:
xfooxxxxxfoo -> [u]x[/u]fooxxxxxfoo -> [u]xfoo[/u]xxxxxfoo ->[u]xfooxxxxx[/u]foo -> [u]xfooxxxxxfoo[/u]
在这个测试中勉强量词首先从输入字符串的第一个字符“x”开始吞噬,此时它所吞噬的x与后面的foo满足匹配要求,因此匹配成功,已经匹配的字符串被消耗掉。然后它会继续吞噬还没有吃掉的字符直到剩下的foo与被吞噬的字符满足匹配要求,完成第二次匹配。
侵占量词也有六种表现形式:x?+、x*+、x++、x{n}+、x{n,}+、x{n,m}+。元字符表示的是所指定的字符或组出现零次或一次以上。在匹配时它会吃掉整个字符串,尝试着一次(也是唯一的一次)匹配。无论匹配是否会成功它都不再会像贪婪一样回退字符,而是结束匹配。
表达式以.*+foo为例,输入字符xfooxxxxxfoo为例,其步骤如下图:
xfooxxxxxfoo -> [u]xfooxxxxxfoo[/u] -> 无匹配
在这个测试中侵占量词直接吃掉输入的整个字符串,由于“foo”也被吞噬掉了,因此没有剩下任何字符串来满足匹配器中后面的“foo”,所以无法找到匹配,匹配失败。此后便退出匹配。
[/size]
贪婪量词有六种表现形式:x?、x*、x+、x{n}、x{n,}、x{n,m}。在匹配的时候它让匹配器直接读入(也可以说成是吃掉)整个输入的字符串,从而来尝试第一匹配。如果在第一次匹配没有成功的话它将会从字符串的右边回退(吐出)一个字符再进行尝试,就这样不断的进行尝试直到找到所有匹配或者是没有匹配为止。
表达式以.*foo为例,输入字符xfooxxxxxfoo为例,其步骤如下图:
xfooxxxxxfoo -> [u]xfooxxxxxfoo[/u] -> [u]xfooxxxxx[/u]foo
在这个测试中贪婪量词首先吃掉整个xfooxxxxxfoo字符串。因为最后的“foo”已经被消耗掉,所以匹配不会成功。然后匹配器会从右边起吐出“o”,再尝试匹配,直到右边吐出foo时,达到了满足了匹配器,完成匹配。此时消耗掉了整个字符串,匹配结束。
勉强量词有六种表现形式:x??、x*?、x+?、x{n}?、x{n,}?、x{n,m}?。元字符表示的是所指定的字符或组出现零次或一次。在匹配时它的机制与贪婪是相反的。它是从输入字符串的开始处吃掉一个字符来尝试匹配。当找到匹配时就消耗掉已成功匹配的字符串,然后继续开始一个一个吞噬再次查找匹配。无论是否找到匹配,它都会尝试整个输入的字符串。
表达式以.*?foo为例,输入字符xfooxxxxxfoo为例,其步骤如下图:
xfooxxxxxfoo -> [u]x[/u]fooxxxxxfoo -> [u]xfoo[/u]xxxxxfoo ->[u]xfooxxxxx[/u]foo -> [u]xfooxxxxxfoo[/u]
在这个测试中勉强量词首先从输入字符串的第一个字符“x”开始吞噬,此时它所吞噬的x与后面的foo满足匹配要求,因此匹配成功,已经匹配的字符串被消耗掉。然后它会继续吞噬还没有吃掉的字符直到剩下的foo与被吞噬的字符满足匹配要求,完成第二次匹配。
侵占量词也有六种表现形式:x?+、x*+、x++、x{n}+、x{n,}+、x{n,m}+。元字符表示的是所指定的字符或组出现零次或一次以上。在匹配时它会吃掉整个字符串,尝试着一次(也是唯一的一次)匹配。无论匹配是否会成功它都不再会像贪婪一样回退字符,而是结束匹配。
表达式以.*+foo为例,输入字符xfooxxxxxfoo为例,其步骤如下图:
xfooxxxxxfoo -> [u]xfooxxxxxfoo[/u] -> 无匹配
在这个测试中侵占量词直接吃掉输入的整个字符串,由于“foo”也被吞噬掉了,因此没有剩下任何字符串来满足匹配器中后面的“foo”,所以无法找到匹配,匹配失败。此后便退出匹配。
[/size]