根据特定模式对标签进行分组

Grouping tags based on a specific pattern

提问人:Oblomov 提问时间:10/20/2023 最后编辑:Oblomov 更新时间:10/20/2023 访问量:55

问:

像这样的文本片段

04040p0015 宏驱动对象 / 宏 DO SERVO, VECTOR, HLA, SERVO_AC, VECTOR_AC, SERVO_I_AC, VECTOR_I_AC, A_INF, S_INF, R_INF, B_INF, TM31, TM15DI_DO, TM120, TM150,

必须解析为四组

  1. 04040
  2. 编号:P0015
  3. 宏驱动器对象 / 宏 DO
  4. 伺服、矢量、HLA、SERVO_AC、VECTOR_AC、SERVO_I_AC、VECTOR_I_AC、A_INF、S_INF、 R_INF、B_INF、TM31、TM15DI_DO、TM120、TM150、

其中第一组和第二组表示不同类型的 ID,第 3 组表示标题,第 4 组包含由 2 个或多个大写字母组成的标记,后跟 none 或 one _ ,后跟无或多个大写字母,后跟逗号。

正则表达式

([0-9]+)([rp][0-9]{4,})(.*)([A-Z]{2,}_?[A-Z,0-9]{2,},)

返回

  1. 04040
  2. 编号:P0015
  3. 宏驱动对象 / 宏 DO SERVO, VECTOR, HLA, SERVO_AC, VECTOR_AC, SERVO_I_AC, VECTOR_I_AC, A_INF, S_INF, R_INF, B_INF, TM31, TM15DI_DO, TM120,
  4. TM150型,

也就是说,它正确地获得了前两组,但未能正确地分离后两组。

正则表达式有什么问题?

则表达式组

评论

0赞 Wiktor Stribiżew 10/20/2023
Ae“标签”总是单个词?
1赞 Oblomov 10/20/2023
是的。我已经相应地指定了这个问题

答:

1赞 anubhava 10/20/2023 #1

您可以使用此正则表达式来获得所需的 4 个捕获组:

(\d+)([rp]\d{4,})(.*?)\s+((?:[A-Z]\w+,\s+)+)

正则表达式演示

正则表达式详细信息:

  • (\d+):第 1 组捕获 1+ 位数字
  • ([rp]\d{4,}):第 2 组匹配以 4+ 数字开头或后跟的文本rp
  • (.*?):第 3 组匹配并捕获 0 个或多个任何字符(懒惰)
  • \s+: 1+ 空格
  • ((?:[A-Z]\w+,\s+)+):第 4 组匹配和捕获以大写字母开头的单词,后跟逗号和 1+ 个空格

评论

0赞 anubhava 10/24/2023
您可以只使用:(\d+)([rp]\d{4,5}(?:\[0\.{3}[n,\d]+\])?)(.*?)\s+((?:[A-Z,0-9,_]+,?\s+)+)(.*)