如何用正则匹配前文中存在isaac的select?原有写法失效原因及解法
正则匹配失效原因
你使用的(?<=isaac)select是定长正向回顾断言,仅能匹配紧接在isaac后面的select,也就是isaacselect这种前后完全相邻的场景。但你的测试文本中isaac位于第一行,和第二行的select之间间隔了大量普通字符、还有换行符,完全不满足「紧接」的要求,因此无法匹配。
解决方案
根据你使用的正则引擎支持能力,可以选择对应写法:
- 如果你用的引擎支持不定长回顾断言 + 单行模式(如Java 9+、PHP、Python PyPi regex库等),可以直接用以下正则:
说明:(?s)(?<=isaac.*?)select(?s)是单行模式标记,让.可以匹配换行符;.*?惰性匹配isaac和select之间的所有内容,只要isaac出现在select之前的任意位置,就能命中后面的select。 - 如果你用的引擎不支持不定长回顾(如JavaScript、Java 8及以下、Python标准re库等),可以用两种方案:
- 若引擎支持
\K标记,使用以下正则:
说明:(?s)^(?=.*isaac).*?\Kselect^(?=.*isaac)先校验整个文本中存在isaac,.*?惰性匹配到select前的位置,\K会丢弃前面匹配的所有内容,仅返回select。 - 若不支持
\K,分两步操作:- 第一步:校验整个文本是否匹配
(?s).*isaac.*,确认isaac存在 - 第二步:单独匹配所有
select字符串即可
- 第一步:校验整个文本是否匹配
- 若引擎支持
内容的提问来源于stack exchange,提问作者sysOut
相关产品推荐
相关产品推荐

