我需要捕获url模式中文本“lnk=”之后的字符串,但是regex抛出了一个错误。
select regexp_extract('www.mysite.com?lnk=snav_rd_clothing¶m=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¶m=homepage:java.lang.String, (?<=(lnk=))(.*?)(?=&|?|$):java.lang.String} of size 2
1条答案
按热度按时间toiithl61#
错误的原因是你逃跑了
?
以及&
只有一个反斜杠。由于配置单元中的字符串文本支持转义序列,因此需要使用双反斜杠将文本反斜杠传递给regex引擎。但是,对于当前任务,您的模式过于复杂,即获取0+个字符,而不是
&
以及?
之后lnk=
.您可以仅依赖于此处的捕获组和否定字符类:
哪里
1
是指第一个(也是这里唯一一个)捕获组。细节:
[?&]
-a?
或者&
(匹配lnk
作为查询参数(名称)lnk=
-a literal substring
lnk公司=([^&?]*)
-第1组:除
&以及
?(the)
[^...]` 是与集合/范围中定义的字符以外的任何字符匹配的求反字符类)