Regex lookbehind在Postgres子字符串中有2个选项

2ekbmq32  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(239)

我需要提取的文本有两种可能的格式为前面的文本。在Postgres函数中使用
在下面的两个示例中,所需结果均为Request successful

[May 08, 12:06AM] Request successful
[Apr 18, 12:10AM] Request req_wofjfiufmjs: Request successful

因此前缀可以是\[.*\]\s\[.*\]\sRequest\sreq_.*:\s
我试过了
(?<=\s*\[.*\]\s|\s*\[.*\]\s*Request\s*req_.*:\s).*
这对第一种情况有效,但对第二种情况无效。

jaxagkaj

jaxagkaj1#

对于第一个示例字符串,您得到了正确的结果,但对于第二个示例字符串,则没有得到正确的结果,因为对于\s*\[.*\]\s部分,左侧的Assert比|\s*\[.*\]\s*Request\s*req_.*:\s部分更早为真
您可以使用regexp_match和lookbehindAssert来编写它,以仅获得匹配,但在这种情况下,模式不会很好,因为它必须匹配第一部分,以确保右侧的第二部分没有匹配。

SELECT regexp_match(MyColumn, '(?<=\s*\[.*\]\s*Request\s*req_.*:\s|\s*\[.*\]\s(?!\s*.*req_.*:\s)).*', '') FROM MyTable;

结果

Request successful
Request successful

也可以用空字符串替换匹配项。\[.*\]\s\[.*\]\sRequest\sreq_.*:\s的匹配可以通过一个可选部件来完成,而无需任何查找。

SELECT regexp_replace(MyColumn, '^\s*\[.*\]\s*(?:Request\s*req_.*:\s)?', '') FROM MyTable;

结果

Request successful
Request successful

相关问题