正则expression式lookahead,lookbehind和primefaces组

我在我的正则expression式中find了这些东西,但是我没有弄清楚我可以使用它们。 有人有例子,所以我可以尝试了解他们是如何工作的?

(?!) - negative lookahead (?=) - positive lookahead (?<=) - positive lookbehind (?<!) - negative lookbehind (?>) - atomic group 

例子

鉴于stringfoobarbarfoo

 bar(?=bar) finds the 1st bar ("bar" which has "bar" after it) bar(?!bar) finds the 2nd bar ("bar" which does not have "bar" after it) (?<=foo)bar finds the 1st bar ("bar" which has "foo" before it) (?<!foo)bar finds the 2nd bar ("bar" which does not have "foo" before it) 

你也可以结合他们:

 (?<=foo)bar(?=bar) finds the 1st bar ("bar" with "foo" before it and "bar" after it) 

定义

向前看正面(?=)

查找expression式A其中expression式B如下:

 A(?=B) 

向前看负面(?!)

查找expression式Aexpression式B不遵循:

 A(?!B) 

看后面的正面(?<=)

查找expression式A在expression式B之前:

 (?<=B)A 

看后面的负面(?<!)

查找expression式Aexpression式B不在前面:

 (?<!B)A 

primefaces团(?>)

primefaces组是一个非捕获组,在组内的模式的第一次匹配之后抛出所有的替代方法,所以禁用回溯。

一个非primefaces组将允许回溯,它仍然会find第一个匹配,那么如果提前匹配失败,它会回溯并find下一个匹配,直到find整个expression式的匹配或者所有的可能性都被用尽。

  • expression式(foo|foot)s非primefaces组适用于foots

    1. 匹配它的第一个替代foo ,然后失败,因为s不会立即跟随,并回到第二个select;
    2. 匹配它的第二个替代foot ,然后立即成功,然后停下来。
  • 应用于foots的expression式(?>foo|foot)sprimefaces组将匹配其第一个替代foo ,然后在s不会立即跟随s情况下失败,并禁用后退。

一些资源

Lookarounds是零宽度断言。 他们检查一个正则expression式(向前或向后的前后左右),find匹配成功或失败(根据是正还是负),并丢弃匹配的部分。 它们不消耗任何字符 – 跟在它们后面的正则expression式的匹配(如果有的话)将从相同的光标位置开始。

阅读regular-expression.info获取更多细节。

  • 积极的前瞻:

句法:

 (?=REGEX_1)REGEX_2 

仅当REGEX_1匹配时才匹配; 在匹配REGEX_1之后,匹配被丢弃,searchREGEX_2从相同的位置开始。

例:

 (?=[a-z0-9]{4}$)[az]{1,2}[0-9]{2,3} 

REGEX_1是[a-z0-9]{4}$ ,它匹配四个字母数字字符,后跟行尾。
REGEX_2是[az]{1,2}[0-9]{2,3} ,它匹配一个或两个字母,后跟两个或三个数字。

REGEX_1确保string的长度确实是4,但不会消耗任何字符,以便在同一位置searchREGEX_2。 现在REGEX_2确保string匹配一些其他规则。 如果没有预见,它会匹配三到五个string。

  • 消极的向前看

句法:

 (?!REGEX_1)REGEX_2 

仅当REGEX_1不匹配时才匹配; 在检查REGEX_1之后,searchREGEX_2从相同的位置开始。

例:

 (?!.*\bFWORD\b)\w{10,30}$ 

超前部分检查string中的FWORD ,如果发现它则失败。 如果找不到FWORD ,则FWORD成功,接下来的部分validationstring的长度在10到30之间,它只包含单词字符a-zA-Z0-9_

后视与前视相似:只是看在当前光标位置后面。 一些像javascript这样的正则expression式不支持隐藏断言。 而支持它的大多数风格(PHP,Python等)都要求隐藏部分具有固定的长度。

  • 一旦令牌匹配,primefaces组基本上丢弃/忘记组中随后的令牌。 检查此页面的primefaces组的例子