PostgreSQL中带双选项的正则后向匹配文本提取问题
PostgreSQL正则提取目标文本的问题解决
问题根源:PostgreSQL采用的POSIX正则表达式不支持可变长度的后向断言(lookbehind),你编写的正则里,
(?<=...)内部的.*属于可变长度匹配,导致第二个前缀分支无法被正确识别。解决方案:放弃后向断言,改用非捕获组+可选分支的方式匹配前缀,直接提取目标内容。可用正则如下:
(?:\s*\[.*?\]\s*(?:Request\s*req_.*?:\s)?)?(.*)拆解说明:
(?:...)为非捕获组,仅匹配内容不保留结果,用来包裹两类前缀\[.*?\]用非贪婪匹配.*?精准匹配方括号内的前缀内容,避免过度匹配(?:Request\s*req_.*?:\s)?标记第二类前缀为可选匹配,?表示该部分可存在或不存在- 最后的
(.*)捕获我们需要的目标文本
测试用例:
针对两类输入,使用PostgreSQL的regexp_matches函数验证:-- 输入1:[INFO] Request successful SELECT regexp_matches('[INFO] Request successful', '(?:\s*\[.*?\]\s*(?:Request\s*req_.*?:\s)?)?(.*)', 'g'); -- 输入2:[DEBUG] Request req_12345: Request successful SELECT regexp_matches('[DEBUG] Request req_12345: Request successful', '(?:\s*\[.*?\]\s*(?:Request\s*req_.*?:\s)?)?(.*)', 'g');两个查询均会返回结果
{Request successful}简化写法:如果目标文本不含换行符,也可以用
regexp_replace直接替换前缀为空,一步得到结果:SELECT regexp_replace('[DEBUG] Request req_12345: Request successful', '^\s*\[.*?\]\s*(?:Request\s*req_.*?:\s)?', '');
内容的提问来源于stack exchange,提问作者thehill
相关产品推荐
相关产品推荐

