我想在两个字符串之间匹配文本,尽管最后一个字符串/字符可能无法使用。
String1:' www.mywebsite.com/search/keyword=toys'
String2:' www.mywebsite.com/search/keyword=toys& lnk = hp1'
在这里,我希望匹配关键字=的值,即玩具'我正在使用
(?&LT =关键字=)(=安培?; | $)(。*)
适用于String1,但对于String2,它匹配'&'
之后的所有内容我做错了什么?
答案 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个或多个匹配项。)