java - 如何在 PostgreSQL 中第一次出现空格时拆分字符串
问题描述
我在 PostgreSQL DB 中有列,我想进行 Flyway 迁移,根据第一次出现的空白将全名拆分为 first_name 和 last_name。有一些胭脂行,要么只有一个词,要么只有几个词。例如:
| fullname |
| ---------------- |
| Admin |
| Jon Doe |
| Vincent Van Gogh |
我想将列全名迁移到:
| first_name | last_name |
| -----------|---------- |
| Admin | |
| John | Doe |
| Vincent | Van Gogh |
不正确的解决方案: 我尝试了几个正则表达式,以便找到正确的正则表达式来在第一次出现空格时拆分字符串。不幸的是,一切都没有成功。任何人都可以帮我找到正确的正则表达式来在第一次出现空格时拆分字符串吗?或者也许有比 regexp_split_to_array() 更好的方法使用其他 PostgreSQL 方法?
UPDATE users
SET first_name = (regexp_split_to_array(users.full_name, '\s+'))[1],
last_name = (regexp_split_to_array(users.full_name, '\s+'))[2],
在 '\s+' 正则表达式的情况下,数组由 3 个元素创建,并且在文森特梵高的情况下,last_name 仅填充第二个元素。
| first_name | last_name |
| -----------|---------- |
| Admin | |
| John | Doe |
| Vincent | Van | <- Missing Gogh surname
解决方案
您可以使用substring
:
UPDATE users
SET first_name = substring(users.full_name, '^\S+'),
last_name = substring(users.full_name, '^\S+\s+(.*)'),
该^\S+
模式匹配字符串开头的 1 个或多个非空白字符。
该^\S+\s+(.*)
模式匹配以 1+ 个非空白字符开头的字符串,然后具有 1+ 个空白字符,然后将任意数量的 0+ 个字符捕获到组 1 中。括号中的部分,捕获组模式,substring
将返回。
但是,如果模式包含任何括号,则返回与第一个带括号的子表达式(左括号在前的那个)匹配的文本部分。
推荐阅读
- rest - Websphere 9 上的 REST Spring Boot Web 服务
- javascript - ReactJS:这是保留字
- javascript - Spinner Overlay Bootstrap 4 Card Body Only - Flex Alignment
- google-chrome - React Native 调试器 - CORB
- php - mod_rewrite 忽略查询字符串并替换 ? 和 &
- jmeter - 解释 JMeter 结果
- jhipster - 部署到 Pivotal CF 的 Jhipster 默认生成的应用程序不会进行身份验证
- google-cloud-pubsub - 发布时间歇性授权失败
- javascript - 使用苍鹭公式计算周长和面积的javascript函数
- swift - 如何缩放 SCNNodes 以适应盒子?