我正在尝试对我的网站进行分类,但它们的 uri 结构并不总是相同,因此我想在一列中提取年份,在第二列中提取月份。
结果应该是单独的列/字段中的年份和月份:
网址 | 年 | 月 |
---|---|---|
/www.site.com/path1/resort/2021/02/sitename | 2021 | 02 |
/www.site.com/path1/2021/02 | 2021 | 02 |
/www.site.com/path1/2020/11-12 | 2020 | 11-12 |
/www.site.com/path1/2020/07-08 | 2020 | 07-08 |
/www.site.com/path1/resort/ | 空 | 空 |
以下正则表达式有效:
REGEXP_EXTRACT(url,'([0-9]{4})') >> result: 2020, null etc.
但是月份的正则表达式并没有只提取月份:
REGEXP_EXTRACT(url,'((?:[0-9]{4}/)[0-9]+.?[0-9]*/)') >> result: 2020/11-12/,2021/02/, null etc.
提前感谢您的帮助。
答案 0 :(得分:1)
你可以使用
(?:^|/)((?:19|20)[0-9]{2})/((?:0?[1-9]|1[0-2])(?:-(?:0?[1-9]|1[0-2]))?)(?:/|$)
参见regex demo。
如果每次匹配只需要捕获一次,请将捕获组替换为非捕获组,或者删除额外的模式:
REGEXP_EXTRACT(col_url, '(?:^|/)((?:19|20)[0-9]{2})(?:/|$)') as Year
REGEXP_EXTRACT(col_url, '(?:^|/)((?:0?[1-9]|1[0-2])(?:-(?:0?[1-9]|1[0-2]))?)(?:/|$)') as Month
详情:
(?:^|/)
- 字符串开始或 /
((?:19|20)[0-9]{2})
- 第 1 组:年份、19
或 20
后跟任意两位数/
- /
字符((?:0?[1-9]|1[0-2])(?:-(?:0?[1-9]|1[0-2]))?)
- 第 2 组(月):可选的 0
然后 1
到 9
,或 1
然后 0
到2
(00
-12
),然后可选出现 -
和相同的月份模式(?:/|$)
- /
或字符串结尾。