如何强制两种模式捕获到正则表达式中的同一组
How can I force two patterns to capture to the same group in regEx
我必须解析一个字符串,格式为!info1!info2!
,info2
是可选的。
我正在尝试使用正则表达式捕获 info1
和 info2
(如果需要)。
我想到了以下模式:
!([^!]*?)!(.*?)!|!(.*?)!
有效,但我对结果不满意:
!foo!bar! -> Group1: foo Group2:bar
!foo! -> Group3: foo
(https://regex101.com/r/D9d6YP/1)
在这两个表达式中,foo
表示相同的意思,后面的处理方式相同。我想在同一个组中捕获它,无论是否有第二个组。
我尝试过使用命名的捕获组,但它们似乎无法重复使用
!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)!
失败并显示错误消息“子模式名称必须是唯一的。
有什么方法可以在同一组中捕获不同的模式吗?
您可以使用可选的非捕获组将两个备选方案合并到一个分支中:
!([^!]*)!(?:([^!]*)!)?
^^^ ^^
详情:
!
- 一个 !
([^!]*)
- 第 1 组:除 !
之外的任何 0+ 个字符
!
- 一个 !
(?:([^!]*)!)?
- 可选的非捕获组(其结果未存储在内存中,未分配 ID)匹配 1 次或 0 次出现
([^!]*)
- 第 2 组:除 !
之外的任何 0+ 个字符
!
- 一个 !
我必须解析一个字符串,格式为!info1!info2!
,info2
是可选的。
我正在尝试使用正则表达式捕获 info1
和 info2
(如果需要)。
我想到了以下模式:
!([^!]*?)!(.*?)!|!(.*?)!
有效,但我对结果不满意:
!foo!bar! -> Group1: foo Group2:bar
!foo! -> Group3: foo
(https://regex101.com/r/D9d6YP/1)
在这两个表达式中,foo
表示相同的意思,后面的处理方式相同。我想在同一个组中捕获它,无论是否有第二个组。
我尝试过使用命名的捕获组,但它们似乎无法重复使用
!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)!
失败并显示错误消息“子模式名称必须是唯一的。
有什么方法可以在同一组中捕获不同的模式吗?
您可以使用可选的非捕获组将两个备选方案合并到一个分支中:
!([^!]*)!(?:([^!]*)!)?
^^^ ^^
详情:
!
- 一个!
([^!]*)
- 第 1 组:除!
之外的任何 0+ 个字符
!
- 一个!
(?:([^!]*)!)?
- 可选的非捕获组(其结果未存储在内存中,未分配 ID)匹配 1 次或 0 次出现([^!]*)
- 第 2 组:除!
之外的任何 0+ 个字符
!
- 一个!