如何正则表达式可以以数字结尾的字符串并对每个部分进行分组

How to regex string that can end with a number and group each part

我有以下测试字符串:

Battery Bank 1
Dummy 32 Segment 12
System
Modbus 192.168.0.1 Group

我需要一个正则表达式来匹配和分组如下:

Group 1: Battery Bank
Group 2: 1

Group 1: Dummy 32 Segment
Group 2: 12

Group 1: System
Group 2: null

Group 1: Modbus 192.168.0.1 Group
Group 2: null

基本上,将所有内容(包括数字)捕获到第 1 组中,除非字符串以空格结尾,后跟 1 个或多个数字。如果是,则将此号码捕获到第 2 组中。

这个正则表达式没有满足我的需要,因为所有内容都被捕获到第一组中。

([\w ]+)( \d+)?

https://regex101.com/r/GEtb5G/1/

Basically, capture everything (including numbers) into group 1 unless the string ends with a whitespace followed by 1 or more digits. If it does, capture this number into group 2.

您可以使用这个允许在第二个捕获组中进行空匹配的组:

^(.+?) *(\d+|)$

Updated RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (.+?): 匹配捕获组 #1
  • 中任意字符的 1+ 个(惰性)
  • *:匹配0个或多个空格
  • (\d+|): 在第 2 个捕获组中匹配 1+ 个数字或什么都不匹配
  • $:结束

你可以使用

^\s*(.*[^\d\s])(?:\s*(\d+))?\s*$

参见 regex demo(注意 \s 被替换为空格,因为演示中的测试字符串是单个多行字符串)。

如果要将正则表达式与多行标志一起使用以匹配较长的多行文本中的,您可以使用

^[^\S\r\n]*(.*[^\d\s])(?:[^\S\r\n]*(\d+))?[^\S\r\n]*$

参见regex demo

详情:

  • ^ - 字符串的开头
  • \s* - 零个或多个空格
  • (.*[^\d\s]) - 第 1 组:除换行字符外的任何零个或多个字符,然后是数字和空格以外的字符
  • (?:\s*(\d+))? - 一个可选的序列
    • \s* - 零个或多个空格
    • (\d+) - 第 2 组:一个或多个数字
  • \s* - 零个或多个空格
  • $ - 字符串结尾。

在第二个正则表达式中,[^\S\r\n]* 匹配除 LF 和 CR 字符之外的任何零个或多个空格。