[英]How to use REGEXP_SUBSTR or REGEXP_EXTRACT in MySQL Workbench with database hosted on Google Cloud SQL?
[英]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。
一些注意事项:
(?<=pattern)
是正向后视,它像普通正则表达式一样工作,但不会放入匹配结果中,将它放在要匹配的字符串之前。pattern
不支持*
和+
。 例如, (?<=ABC DEF\s+)
在大多数情况下不受支持,您需要将\s+
移到外面以匹配空格并稍后修剪它们,请查看关于 Lookbehind 的重要说明{my_variable_length_keyword}
有什么模式,但它似乎不包含空格, \S
可以匹配一个非空格字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.