如何解释 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 前导空格,然后您将获得最终输出。

一些注意事项:

  1. (?<=pattern) 是正后视,它像普通正则表达式一样工作,但 不会放入匹配结果 ,将其放在要匹配的字符串之前。
  2. 在大多数平台上,lookbehind 中的 pattern 不支持 *+。例如,(?<=ABC DEF\s+) 在大多数情况下不受支持,您需要将 \s+ 移到外面以匹配空格,然后 trim 它们,检查 Important Notes About Lookbehind
  3. 虽然不知道 {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' - 允许从结果匹配中提取子表达式(又名 捕获组 值)。