我正在尝试从一组ldap objectclass
定义中找到与以下每种情况匹配的正则表达式-它们实际上只是字符串。
语法上的变化使我的正则表达式绊倒了,我似乎无法在比赛的贪婪本质和可选单词“ MAY”之间找到平衡。
( class1-OID NAME 'class1' SUP top STRUCTURAL MUST description MAY ( brand $ details $ role ) )
期望的输出:说明
ACTUAL GROUP1:说明
ACTUAL GROUP1与?在MAY群组中:说明MAY
( class2-OID NAME 'class2' SUP top STRUCTURAL MUST groupname MAY description )
所需输出:组名
ACTUAL GROUP1:组名
ACTUAL GROUP1与?在MAY组上:组名MAY描述
( class3-OID NAME 'class3' SUP top STRUCTURAL MUST ( code $ name ) )
期望的输出:代码$名称
ACTUAL GROUP1:不匹配
ACTUAL GROUP1与?在MAY组中:代码$ name
( class4-OID NAME 'class4' SUP top STRUCTURAL MUST ( code $ name ) MAY ( group $ description ) )
期望的输出:代码$名称
实际群组1:代码$名称
ACTUAL GROUP1与?在MAY组中:代码$ name
使用此:
MUST \(?([\w\$\-\s]+)\)?\s*(?:MAY)
(Regex101)
匹配第1、2和4行,但不匹配没有MAY
语句的第3行。
添加可选的“?” MAY
组的结果与3和4的匹配度很好,但是第一行和第二行贪婪地起作用,然后进入MAY
(第1行)或字符串的其余部分(第2行)
好像我需要正则表达式将MAY
视为可选内容,而且还发现如果找到MAY
,它应该停止-我似乎无法找到平衡点。
答案 0 :(得分:1)
如果您可以将正则表达式与两个捕获组一起使用,则可以使用
MUST\s+(?:\(([^()]+)\)|(\S+))\s*(?:MAY)?
请参见regex demo
详细信息
MUST
-单词MUST
\s+
-超过1个空格(?:\(([^()]+)\)|(\S+))
-两种选择:
\(
-(
([^()]+)
-第1组:除了(
和)
以外的1个以上的字符\)
-一个)
字符|
-或(\S+)
-第2组:一个或多个非空白字符\s+
-超过1个空格(?:MAY)?
-可选单词MAY