如何解释 regexp_substr() 方法中的所有空格(空格、制表符、换行符)?
How to account for all whitespace (spaces, tabs, new lines) in regexp_substr() method?
我在 SQL 中有以下代码片段 select ABC DEF
之后的下一段文本,长度可变:
SELECT trim('ABC DEF ' FROM regexp_substr(my_field, 'ABC DEF ([^ ]+)')) FROM my_table
示例数据:
'{random text here} ABC DEF {my_variable_length_keyword} {random text here}'
预期输出:
{my_variable_length_keyword}
虽然这有效,但它仅适用于 ABC DEF
之后有一个 space 的情况。我将如何处理下一个单词之前有制表符、换行符或多个 space 的情况?
我试过:
SELECT trim('ABC DEF ' FROM regexp_substr(my_field, 'ABC DEF\s+([^ ]+)')) FROM my_table
但这并没有产生任何结果。
有人可以帮我解决这个问题吗?谢谢!
(?<=ABC DEF)\s+\S+
或 (?<=ABC DEF)\s+\S+
用于其他语言中使用的字符串文字。
Trim 前导空格,然后您将获得最终输出。
一些注意事项:
(?<=pattern)
是正后视,它像普通正则表达式一样工作,但 不会放入匹配结果 ,将其放在要匹配的字符串之前。
- 在大多数平台上,lookbehind 中的
pattern
不支持 *
和 +
。例如,(?<=ABC DEF\s+)
在大多数情况下不受支持,您需要将 \s+
移到外面以匹配空格,然后 trim 它们,检查 Important Notes About Lookbehind
- 虽然不知道
{my_variable_length_keyword}
有什么模式,但它似乎不包含空格,\S
可以匹配一个 non-whitespace 个字符。
您不需要使用任何环视,也不需要 trim 前缀与正则表达式匹配,因为使用 REGEXP_SUBSTR
您可以指定一个捕获组并仅提取其内容。
SELECT regexp_substr(my_field, 'ABC\s+DEF\s+(\S+)', 1, 1, 'e') FROM my_table
这是regex demo.
详情:
ABC\s+DEF\s+(\S+)
- ABC
,一个或多个空格,DEF
,一个或多个空格(此文本刚好匹配),然后是一个或多个 non-whitespace 个字符被 捕获 到第 1 组(请注意,您需要加倍转义反斜杠,因为单个反斜杠用于形成字符串转义序列,并且要引入文字 \
它需要加倍)
1
- 从字符串中的第一个字符开始搜索
1
- 告诉正则表达式引擎提取第一次出现的模式
'e'
- 允许从结果匹配中提取子表达式(又名 捕获组 值)。
我在 SQL 中有以下代码片段 select ABC DEF
之后的下一段文本,长度可变:
SELECT trim('ABC DEF ' FROM regexp_substr(my_field, 'ABC DEF ([^ ]+)')) FROM my_table
示例数据:
'{random text here} ABC DEF {my_variable_length_keyword} {random text here}'
预期输出:
{my_variable_length_keyword}
虽然这有效,但它仅适用于 ABC DEF
之后有一个 space 的情况。我将如何处理下一个单词之前有制表符、换行符或多个 space 的情况?
我试过:
SELECT trim('ABC DEF ' FROM regexp_substr(my_field, 'ABC DEF\s+([^ ]+)')) FROM my_table
但这并没有产生任何结果。
有人可以帮我解决这个问题吗?谢谢!
(?<=ABC DEF)\s+\S+
或 (?<=ABC DEF)\s+\S+
用于其他语言中使用的字符串文字。
Trim 前导空格,然后您将获得最终输出。
一些注意事项:
(?<=pattern)
是正后视,它像普通正则表达式一样工作,但 不会放入匹配结果 ,将其放在要匹配的字符串之前。- 在大多数平台上,lookbehind 中的
pattern
不支持*
和+
。例如,(?<=ABC DEF\s+)
在大多数情况下不受支持,您需要将\s+
移到外面以匹配空格,然后 trim 它们,检查 Important Notes About Lookbehind - 虽然不知道
{my_variable_length_keyword}
有什么模式,但它似乎不包含空格,\S
可以匹配一个 non-whitespace 个字符。
您不需要使用任何环视,也不需要 trim 前缀与正则表达式匹配,因为使用 REGEXP_SUBSTR
您可以指定一个捕获组并仅提取其内容。
SELECT regexp_substr(my_field, 'ABC\s+DEF\s+(\S+)', 1, 1, 'e') FROM my_table
这是regex demo.
详情:
ABC\s+DEF\s+(\S+)
-ABC
,一个或多个空格,DEF
,一个或多个空格(此文本刚好匹配),然后是一个或多个 non-whitespace 个字符被 捕获 到第 1 组(请注意,您需要加倍转义反斜杠,因为单个反斜杠用于形成字符串转义序列,并且要引入文字\
它需要加倍)1
- 从字符串中的第一个字符开始搜索1
- 告诉正则表达式引擎提取第一次出现的模式'e'
- 允许从结果匹配中提取子表达式(又名 捕获组 值)。