在 google data studio 中使用 google-re2 使用 lookbehind 和 forward forward 进行正则表达式提取
regexp extract with lookbehind and lookforward with google-re2 in google data studio
我正在尝试在 CASE
语句中构建一个 REGEXP_EXTRACT
查询,但它并没有完全按照我想要的方式运行:
示例数据:
1234-ABC
1234-abc
1234-ABC-1a
1234
1234-abc-test-this
我想做的是从查询中捕获 ABC|abc
(如果存在)。如果它不存在,我想return一个默认值。
我找到了一个页面,我可以在其中查看 Google-RE2 RegEx.
的正则表达式可能性
我知道如何构建案例:
CASE
WHEN REGEXP_MATCH(Eventcategory, '^([0-9])*-([a-zA-Z0-9])*$') THEN 'it matches 1234-ABC and 1234-abc'
WHEN REGEXP_MATCH(Eventcategory, '^([0-9])*-([a-zA-Z0-9])*-([a-zA-Z0-9])*') THEN 'it matches 1234-ABC-1a and 1234-abc-test-this'
ELSE "it matches 1234"
END
问题出在提取 Eventcategory
的正确部分。
到目前为止我尝试过的:
REGEXP_EXTRACT(Eventcategory, '-([a-zA-Z0-9])*-') // Then it was only still needed to remove the - at the beginning and end
REGEXP_EXTRACT(Eventcategory, '-([a-zA-Z0-9])*$') // if it was 1234-Abc
REGEXP_EXTRACT(Eventcategory, '(?=^([0-9])*-)((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '(?=^([0-9])*-)((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '(-([a-zA-Z])+)')
REGEXP_EXTRACT(Eventcategory, '(?=(^([0-9])*-))(-([a-zA-Z])+)')
真的希望有人能帮助我,因为我现在没有任何选择。
为了让你的模式工作,你需要在你需要提取的模式部分周围使用一个捕获组,将 *
放在字符 class 之后并删除 $
主播:
'^[0-9]*-([a-zA-Z0-9]*)'
或者,您还可以通过将 *
(0 或更多)替换为 +
(1 或更多)来确保每个子模式至少匹配 1 个字符:
'^[0-9]+-([a-zA-Z0-9]+)'
参见 the regex demo。
或者,您可以使用
^[^-]+-([^-]+)
它将匹配
^
- 字符串开头
[^-]+
- -
以外的 1 个或多个字符
-
- 一个连字符
([^-]+)
- 第 1 组(您提取的值):-
以外的 1+ 个字符
参见 this regex demo。
我正在尝试在 CASE
语句中构建一个 REGEXP_EXTRACT
查询,但它并没有完全按照我想要的方式运行:
示例数据:
1234-ABC
1234-abc
1234-ABC-1a
1234
1234-abc-test-this
我想做的是从查询中捕获 ABC|abc
(如果存在)。如果它不存在,我想return一个默认值。
我找到了一个页面,我可以在其中查看 Google-RE2 RegEx.
的正则表达式可能性我知道如何构建案例:
CASE
WHEN REGEXP_MATCH(Eventcategory, '^([0-9])*-([a-zA-Z0-9])*$') THEN 'it matches 1234-ABC and 1234-abc'
WHEN REGEXP_MATCH(Eventcategory, '^([0-9])*-([a-zA-Z0-9])*-([a-zA-Z0-9])*') THEN 'it matches 1234-ABC-1a and 1234-abc-test-this'
ELSE "it matches 1234"
END
问题出在提取 Eventcategory
的正确部分。
到目前为止我尝试过的:
REGEXP_EXTRACT(Eventcategory, '-([a-zA-Z0-9])*-') // Then it was only still needed to remove the - at the beginning and end
REGEXP_EXTRACT(Eventcategory, '-([a-zA-Z0-9])*$') // if it was 1234-Abc
REGEXP_EXTRACT(Eventcategory, '(?=^([0-9])*-)((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '(?=^([0-9])*-)((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '(-([a-zA-Z])+)')
REGEXP_EXTRACT(Eventcategory, '(?=(^([0-9])*-))(-([a-zA-Z])+)')
真的希望有人能帮助我,因为我现在没有任何选择。
为了让你的模式工作,你需要在你需要提取的模式部分周围使用一个捕获组,将 *
放在字符 class 之后并删除 $
主播:
'^[0-9]*-([a-zA-Z0-9]*)'
或者,您还可以通过将 *
(0 或更多)替换为 +
(1 或更多)来确保每个子模式至少匹配 1 个字符:
'^[0-9]+-([a-zA-Z0-9]+)'
参见 the regex demo。
或者,您可以使用
^[^-]+-([^-]+)
它将匹配
^
- 字符串开头[^-]+
--
以外的 1 个或多个字符
-
- 一个连字符([^-]+)
- 第 1 组(您提取的值):-
以外的 1+ 个字符
参见 this regex demo。