Hive regex:积极前瞻以匹配'&'或者字符串的结尾

时间:2017-03-07 12:30:49

标签: hive

我想在两个字符串之间匹配文本,尽管最后一个字符串/字符可能无法使用。

String1:' www.mywebsite.com/search/keyword=toys'

String2:' www.mywebsite.com/search/keyword=toys& lnk = hp1'

在这里,我希望匹配关键字=的值,即玩具'我正在使用

(?&LT =关键字=)(=安培?; | $)(。*)

适用于String1,但对于String2,它匹配'&'

之后的所有内容

我做错了什么?

2 个答案:

答案 0 :(得分:2)

.*贪婪。它会占用一切,因此会停在字符串末尾($)而不是&字符。
将其更改为非贪婪版本 - .*?

with t as
(
    select  explode
            (
                array
                (
                    'www.mywebsite.com/search/keyword=toys'
                   ,'www.mywebsite.com/search/keyword=toys&lnk=hp1'
                )
            ) as (val)
)
select  regexp_extract(val,'(?<=keyword=)(.*?)(?=&|$)',0)
from    t
;
+------+
| toys |
+------+
| toys |
+------+

答案 1 :(得分:0)

当您需要匹配零个或多个出现的除了一个特定字符(或一组字符)以外的任何字符时,您无需费心。您所需要做的就是摆脱前瞻和点图案,并使用[^&]*(或者,如果您期望的值不应该是空字符串,则使用[^&]+):

(?<=keyword=)[^&]+

代码:

select regexp_extract(val,'(?<=keyword=)[^&]+', 0) from t

请参见regex demo

请注意,您甚至不需要捕获组,因为0参数指示regexp_extract检索完全匹配的值。

模式详细信息

  • (?<=keyword=)-与后面紧跟keyword=的位置相匹配的正向外观
  • [^&]+-除&以外的任何1个以上的字符(如果您使用*而不是+,则它将匹配0个或多个匹配项。)