首页 > 解决方案 > 正则表达式:将字符串拆分为 1 个或多个组

问题描述

我正在使用 Google 表格的 REGEXEXTRACT 函数。每行的数据是一个字符串,如下所示:

2020 02 15 - Joe Sephine
2020 02 18 - Candy Kane - 图特套房 - 123 Some Street
2020 02 19 - Badonk Edonk - 在船上

我需要为每一行捕获以下组:

(2020 02 15)(Joe Sephine)
(2020 02 18)(Candy Kane)(Toot Suites)(123 Some Street)
(2020 02 19)(Badonk Edonk)(On A Boat)

分隔符始终为“-”(空格连字符空格),但并非每一行都有相同数量的分隔符。

拆分字符串似乎应该很简单,但我的正则表达式技能充其量只是初级;我已经为此努力了大约一个小时(在 regex101.com 的帮助下),但未能设计出产生所需输出的表达式。

我正在尝试对此的变化:

^(?>[0-9 ]* - )(.*)( - .*)?  

但我的输出总是捕获前两组,而不是其余组:

(2020 02 15)(Joe Sephine)
(2020 02 18)(Candy Kane)(Toot Suites)(123 Some Street)
(2020 02 19)(Badonk Edonk)(在船上)

或者它将日期之后的所有内容作为一个组捕获:

(2020 02 15)( - Joe Sephine)
(2020 02 18)( - Candy Kane - Toot Suites - 123 Some Street)
(2020 02 19)( - Badonk Edonk - 在船上)

我愿意接受你的建议

标签: regexstringsplitdelimiter

解决方案


如果您需要获得 2、3 或 4 组,您可以使用

^(.*?) - (.*?)(?: - (.*?))?(?: - (.*?))?$

查看正则表达式演示

细节

  • ^- 字符串的开始
  • (.*?)- 第 1 组:除换行符之外的任何零个或多个字符,尽可能少
  • - - 一个空间, -, 空间
  • (.*?)- 第 2 组:除换行符之外的任何零个或多个字符,尽可能少
  • (?: - (.*?))?- 一个可选的非捕获组匹配 1 或 0 次出现
    • - - 一个空间, -, 空间
    • (.*?)- 第 3 组:除换行符之外的任何零个或多个字符,尽可能少
  • (?: - (.*?))?- 一个可选的非捕获组匹配 1 或 0 次出现
    • - - 一个空间, -, 空间
    • (.*?)- 第 4 组:除换行符之外的任何零个或多个字符,尽可能少
  • $- 字符串结束。

推荐阅读