繁体   English   中英

如何解释 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}'

预计 Output: {my_variable_length_keyword}

虽然这行得通,但它仅适用于ABC DEF之后有一个空格的情况。 我将如何处理下一个单词之前有制表符、换行符或多个空格的情况?

我试过了:

SELECT trim('ABC DEF ' FROM regexp_substr(my_field, 'ABC DEF\s+([^ ]+)')) FROM my_table

但这不会产生任何结果。

有人可以帮我解决这个问题吗? 谢谢!

您不需要使用任何环视,也不需要修剪与正则表达式匹配的前缀,因为使用REGEXP_SUBSTR您可以指定一个捕获组并仅提取其内容。

SELECT regexp_substr(my_field, 'ABC\\s+DEF\\s+(\\S+)', 1, 1, 'e') FROM my_table

这是正则表达式演示

详情

  • ABC\s+DEF\s+(\S+) - ABC 、一个或多个空格、 DEF 、一个或多个空格(此文本刚好匹配),然后一个或多个非空格字符被捕获到第 1 组中(注意您需要加倍转义反斜杠,因为单个反斜杠用于形成字符串转义序列,并引入文字\它需要加倍)
  • 1 - 从字符串中的第一个字符开始搜索
  • 1 - 告诉正则表达式引擎提取第一次出现的模式
  • 'e' - 启用从结果匹配中提取子表达式(也称为捕获组值)。

(?<=ABC DEF)\s+\S+(?<=ABC DEF)\\s+\\S+用于其他语言中使用的字符串文字。

修剪前导空格,然后您将获得最终的 output。

一些注意事项:

  1. (?<=pattern)是正向后视,它像普通正则表达式一样工作,但不会放入匹配结果中,将它放在要匹配的字符串之前。
  2. 在大多数平台上,lookbehind 中的pattern不支持*+ 例如, (?<=ABC DEF\s+)在大多数情况下不受支持,您需要将\s+移到外面以匹配空格并稍后修剪它们,请查看关于 Lookbehind 的重要说明
  3. 虽然不知道{my_variable_length_keyword}有什么模式,但它似乎不包含空格, \S可以匹配一个非空格字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM