正则表达式错误参数

s8vozzvw  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(360)

我需要捕获url模式中文本“lnk=”之后的字符串,但是regex抛出了一个错误。

select regexp_extract('www.mysite.com?lnk=snav_rd_clothing&param=homepage', '(?<=(lnk=))(.*?)(?=\&|\?|$)') from table1 limit 10;

FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ''(?<=(lnk=))(.*?)(?=\&|\?|$)'': org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public java.lang.String org.apache.hadoop.hive.ql.udf.UDFRegExpExtract.evaluate(java.lang.String,java.lang.String)  on object org.apache.hadoop.hive.ql.udf.UDFRegExpExtract@65c86db8 of class org.apache.hadoop.hive.ql.udf.UDFRegExpExtract with arguments {www.mysite.com?lnk=snav_rd_clothing&param=homepage:java.lang.String, (?<=(lnk=))(.*?)(?=&|?|$):java.lang.String} of size 2
toiithl6

toiithl61#

错误的原因是你逃跑了 ? 以及 & 只有一个反斜杠。由于配置单元中的字符串文本支持转义序列,因此需要使用双反斜杠将文本反斜杠传递给regex引擎。
但是,对于当前任务,您的模式过于复杂,即获取0+个字符,而不是 & 以及 ? 之后 lnk= .
您可以仅依赖于此处的捕获组和否定字符类:

regexp_extract(str, '[?&]lnk=([^&?]*)', 1)

哪里 1 是指第一个(也是这里唯一一个)捕获组。
细节: [?&] -a ? 或者 & (匹配 lnk 作为查询参数(名称) lnk= - a literal substring lnk公司=([^&?]*)-第1组:除&以及?(the)[^...]` 是与集合/范围中定义的字符以外的任何字符匹配的求反字符类)

相关问题