regex - 如何在 PostgreSQL 中将包含数值的字符串拆分为三部分?

标签 regex postgresql pattern-matching

我想使用 regexp_matches() 拆分可能包含数值的给定字符串。它应该标识包含可选符号和可选小数位的数值的第一次出现。不匹配的部分也应返回 - 作为数组的第一个和最后一个位置。

一些示例输入和预期输出值:

'hello+111123.454545world' -> {hello,+111123.454545,world}
'he-lo+111123.454545world' -> {he-lo,+111123.454545,world}
'hel123.5lo+111123.454545world' -> {hel,123.5,lo+111123.454545world}
'hello+111123.454545world' -> {hello,+111123.454545,world}
'hello+111123.454545world' -> {hello,+111123.454545,world}
'1111.15' -> {"",1111.15,""}
'-.234' -> {"",-.234,""}
'hello-.234' -> {hello,-.234,""}

我在处理以下由“TODO”表示的表达式中匹配组的第一部分时遇到问题。它应该匹配任何不能被识别为数值的东西。

select regexp_matches('input', '(TODO)((?:\+|-)?(?:\d*(?:(?:\.)?\d+)))(.*)')

'(TODO)'代表的匹配组需要是第二个匹配组中正则表达式的否定。 (因为需要返回结果)。用于匹配数值的正则表达式工作正常,我需要的是如何匹配字符串的第一部分不是数值。

最佳答案

regexp_matches(input, '(^.*?)([+-]?\d*\.?\d+)(.*$)') AS result_arr
  • 第一个匹配项:(^.*?)
    使用 ^ 锚定到字符串的开头。 non-greedy quantifier *?至关重要。
    它实际上不必是第二个匹配组中正则表达式的否定,因为正则表达式的其余部分是贪婪。所以第一部分是保留的部分,由其余部分定义。

  • 第二场比赛:([+-]?\d*?\.?\d+)
    我稍微简化了你的表达。特别是字符类 [+-] 比非捕获括号 (?:\+|-) 中的两个分支更短更快。
    Non-capturing parentheses是重要的。 (你已经有了。)
    简化了 \d* 来自@maraca 的评论。

  • 第三场比赛:(.*$)
    使用 $ 锚定到字符串的末尾。对于最后一个匹配项,使量词贪婪

SQL Fiddle带有扩展测试用例。

关于regex - 如何在 PostgreSQL 中将包含数值的字符串拆分为三部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632332/

相关文章:

javascript - 对数据库的 API 响应中的字符串进行编码或转义?

Python:如何获取方括号内的多个元素

java - 合并两个正则表达式

java - 通过java中的正则表达式从emailId中找出域

java - 正则表达式模式匹配除其中某些字符串之外的模式

javascript - 用 HTML 元素替换部分字符串

sql - 选择具有特定属性的分组行

sql - 增量 DISTINCT/GROUP BY 操作

java - 使用 ChoiceFormat 模式显示报价

string - 匹配一个字符串