正则表达式可选词

时间:2018-10-31 07:59:46

标签: regex

我正在尝试从一组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,它应该停止-我似乎无法找到平衡点。

1 个答案:

答案 0 :(得分:1)

如果您可以将正则表达式与两个捕获组一起使用,则可以使用

MUST\s+(?:\(([^()]+)\)|(\S+))\s*(?:MAY)?

请参见regex demo

详细信息

  • MUST-单词MUST
  • \s+-超过1个空格
  • (?:\(([^()]+)\)|(\S+))-两种选择:
    • \(-(
    • ([^()]+)-第1组:除了()以外的1个以上的字符
    • \)-一个)字符
    • |-或
    • (\S+)-第2组:一个或多个非空白字符
  • \s+-超过1个空格
  • (?:MAY)?-可选单词MAY