regex - 正则表达式:将字符串拆分为 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 - 在船上)
我愿意接受你的建议
解决方案
如果您需要获得 2、3 或 4 组,您可以使用
^(.*?) - (.*?)(?: - (.*?))?(?: - (.*?))?$
查看正则表达式演示
细节
^
- 字符串的开始(.*?)
- 第 1 组:除换行符之外的任何零个或多个字符,尽可能少-
- 一个空间,-
, 空间(.*?)
- 第 2 组:除换行符之外的任何零个或多个字符,尽可能少(?: - (.*?))?
- 一个可选的非捕获组匹配 1 或 0 次出现-
- 一个空间,-
, 空间(.*?)
- 第 3 组:除换行符之外的任何零个或多个字符,尽可能少
(?: - (.*?))?
- 一个可选的非捕获组匹配 1 或 0 次出现-
- 一个空间,-
, 空间(.*?)
- 第 4 组:除换行符之外的任何零个或多个字符,尽可能少
$
- 字符串结束。
推荐阅读
- angular - TypeError:未定义的属性(Angular)
- mysql - 有没有办法在 MySQL 的列中索引多个值
- mongodb - MongoDB Atlas Search:自动完成,分数模糊
- android - 如何在 Android 中以编程方式更改 ListView 项?
- python - 在 Pycharm 上找不到子进程文件,但命令在控制台上有效
- python - 如何从字符串中生成日期范围并在 python 中获取另一个字符串列表?
- time - 发表主题一段时间
- sql - 从表中选择时如何解决 NULL 值问题?
- python - 如何找到一对参数以最小化采用 4 个输入参数的标量函数的值?
- laravel - 无法升级到 Laravel 8