=Start=
缘由:
把前段时间跑SQL时遇到的正则表达式问题简单记录一下,方便后面有需要的时候参考。
正文:
参考解答:
1. 正则表达式中的反斜杠
question
正则表达式中,如果想要在方括号表示的字符集中添加反斜杠符号,需要用几个连续的反斜杠符号来表示?
answer
在正则表达式中,如果要在方括号 []
表示的字符集中添加反斜杠 \
本身作为一个匹配字符,需要用 两个连续的反斜杠 \\
来表示一个字面意义上的反斜杠符号。
原因:
- 反斜杠
\
在正则表达式中是 转义字符。 - 如果你希望匹配实际的反斜杠字符(而不是用它来转义其他字符),就需要用
\\
来表示“这是一个普通的反斜杠”。
示例:
比如你想匹配一个字符串中的反斜杠或斜杠(即 \
或 /
),你可以写这样的字符集:
[\\/]
[\\/]
表示匹配一个反斜杠\
或者斜杠/
。- 第一个
\
是转义字符,第二个\
是要匹配的实际字符。
结论:
在正则表达式的字符集中([]
中),要表示一个反斜杠字符 \
,需要使用 两个连续的反斜杠 \\
。
question
在正则表达式中,如果想要匹配2个连续的反斜杠,正则表达式应该怎么写?
answer
在正则表达式中,如果你想匹配 两个连续的反斜杠 \\
(即一个字面意义上的反斜杠后紧跟另一个反斜杠),你需要写成:
\\\\
原因解释:
- 在正则表达式中,单个反斜杠
\
是转义字符,不能单独使用。 - 所以要表示 一个字面意义上的反斜杠,你必须写成
\\
。 - 那么要表示 两个连续的字面反斜杠
\\
,你就需要写成:
\\\\
即:每个 \
都需要被转义为 \\
。
示例说明:
要匹配的内容 | 正则表达式 | 说明 |
---|---|---|
一个反斜杠 \ | \\ | 每个 \ 都需要用另一个 \ 来转义 |
两个反斜杠 \\ | \\\\ | 表示两个连续的字面反斜杠 |
四个反斜杠 \\\\ | \\\\\\\\ | 类推… |
实际应用举例:
如果你希望匹配字符串中的两个连续反斜杠 \\
,比如出现在路径字符串中:
C:\\Program Files\\
你可以用如下正则来匹配其中的 \\
:
\\\\
或者更具体地匹配两个连续的反斜杠:
(?:\\){2}
等价于:
\\\\
✅ 结论:
要匹配 两个连续的反斜杠 \\
,正则表达式应写作:
\\\\
2. 一个实际场景
-- 待匹配字段中的部分内容抽样
"DeviceID":1234567858502008860,
\"DeviceID\":1234567858502008860,
\"did\":\"1234567858502008860\",
\\\"passport_web_did\\\":\\\"1234567858502008860\\\",
方法一(适用性偏窄):
先使用 get_json_object 函数从原始字符串(需要是符合json格式语法要求的字符串)中提取出内层的一些内容,然后再用 regexp_extract 进行提取:
,regexp_extract(lower(get_json_object(extra, '$[0].text')),'(deviceid|did)[\\":]{2,}(\\d{3,})',2) as deviceid
方法二(推荐):
直接用 regexp_extract 进行提取,正则表达式和上面的稍有不同:
,regexp_extract(lower(extra),'(deviceid|did)[\\\\":]{2,}([^"\\\\]{3,})',2) as deviceid
一个可能的解释是,对于公司内的大数据查询平台来说,会对反斜杠(Backslash)进行转义,所以正常情况下需要用2个反斜杠来表示1个反斜杠,如果想要在方括号表示的字符集中添加反斜杠符号,(在内部的数据查询平台上)需要用4个连续的反斜杠符号来表示。简单来说就是,平时在正则表达式里面就需要用两个连续的反斜杠来表示一个字面意义上的反斜杠符号。对于会“吃”反斜杠的平台来说,那就需要用2倍——4个连续的反斜杠来达到相同的目标。
参考链接:
=END=