我必须解析一个格式为!info1!info2!
的字符串,info2
是可选的。
我正在尝试使用正则表达式捕获info1
和info2
(如果需要)。
我想出了以下模式:
!([^!]*?)!(.*?)!|!(.*?)!
它有效,但我对结果不满意:
!foo!bar! -> Group1: foo Group2:bar
!foo! -> Group3: foo
(https://regex101.com/r/D9d6YP/1)
在两个表达式中,foo
表示相同的事情,并且之后将以相同的方式处理。我想在同一组中捕获它,无论是否有第二组。
我曾尝试使用命名捕获组,但似乎无法重用
!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)!
失败并显示错误消息'子模式名称必须唯一。
有没有办法在同一组中捕捉不同的模式?
答案 0 :(得分:1)
您可以使用可选的非捕获组将两个备选方案合并到一个分支中:
!([^!]*)!(?:([^!]*)!)?
^^^ ^^
请参阅regex demo
<强>详情:
!
- !
([^!]*)
- 第1组:除!
!
- !
(?:([^!]*)!)?
- 一个可选的非捕获组(其结果未存储在内存中,没有为其分配ID)匹配1或0次出现
([^!]*)
- 第2组:除!
!
- !