正则表达式-常用构造子列表
字符表示单个字符。例如a,它将匹配字符串中第一次出现的字符a;它也可以匹配第二个 a,这必须是你告诉正则表达式引擎从第一次匹配的地方开始搜索。 可以使用特殊字符序列代表某些不可显示字符。
字符集
字符集是由一对括号[]括起来的字符集合。使用字符集,可以告诉正则表达式引擎仅仅匹配多个字符中的一个。 字符集可以出现在其它字符集中,并且可以包含并集运算符(隐式)和交集运算符 (&&)。
并集和交集的应用示例如下: [a-c[h-j]] a到c或h到j的任何字符(并) [a-z&&[^hij]] a到z,除了h、i、j(减去),等效于[a-gk-z] [a-z&&[^h-j]] a到z,而非h到j(减去),等效于[a-gk-z]
预定义字符集预定义字符集可以用在方括号之内或之外。 例如sd匹配一个空白符后面紧跟一个数字;[sd]匹配单个空白符或数字。
边界匹配符
逻辑操作符
量词量词描述了一个模式吸收输入文本的模式。
量词的贪婪性 量词?+*会导致正则表达式引擎尽可能的重复前导字符。只有当这种重复会引起整个正则表达式匹配失败的情况下,引擎会进行回溯。也就是说,它会放弃最后一次的“重复”,然后处理正则表达式余下的部分。 例如,用一个正则表达式匹配一个HTML标签。 输入字符串为”This is a <EM>first</EM> test”,正则表达式<.+>返回”<EM>first</EM>”。这是因为+是贪婪性的。 让我们来看看正则引擎的处理过程。 正则表达式的第一个符号是“<”,这是一个字符;第二个符号是“.”,匹配了字符“E”;第三个符号是“+”,它可以一直可以匹配后面的字符,直到一行的结束;然后遇到了换行符,匹配失败(“.”不匹配换行符)。于是引擎开始对下一个正则表达式符号进行匹配,也即试图匹配“>”。到目前为止,正则表达式“<.+”已经匹配了“<EM>first</EM> test”。引擎会试图将“>”与换行符进行匹配,结果失败了。于是引擎进行回溯,“<.+”匹配“<EM>first</EM> tes”,于是引擎将“>”与“t”进行匹配,显然还是会失败。这个过程继续,直到“<.+”匹配“<EM>first</EM”,“>”与“>”匹配。最后引擎找到了一个匹配的部分“<EM>first</EM>”。 因为正则导向的引擎是“急切的”,所以它会急着报告它找到的第一个匹配。而不是继续回溯,即使可能会有更好的匹配,例如“<EM>”。所以由于“+”的贪婪性,使得引擎返回了一个最长的匹配。 可以使用下列方式来解决量词的贪婪性带来的问题。
输入字符串为”This is a <EM>first</EM> test”,正则表达式<.+?>返回”<EM>”。 让我们再来看看正则引擎的处理过程。 正则表达式符号“<”会匹配素如字符串的第一个“<”。下一个正则符号是“.”。这次是一个懒惰的“+?”来重复上一个字符,它会尽可能少的重复上一个字符。因此引擎匹配“.”和字符“E”,然后用“>”匹配“M”,结果失败了。引擎会进行回溯,和上一个例子不同,因为是惰性重复,所以引擎是扩展惰性重复而不是减少;于是“<.+”现在被扩展为“<EM”。引擎继续匹配下一个符号“>”。这次得到了一个成功匹配。引擎于是报告“<EM>”是一个成功的匹配。
输入字符串为”This is a <EM>first</EM> test”,正则表达式<[^>]+>返回”<EM>”。 这是一个更好的替代方案。可以用一个贪婪重复与一个取反字符集<[^>]+>。之所以说这是一个更好的方案在于使用惰性重复时,引擎会在找到一个成功匹配前对每一个字符进行回溯。而使用取反字符集则不需要进行回溯。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |