re = /MUST\s+(?:\(([^()]+)\)|(\S+))\s*(?:MAY)?/m
str = '( class1-OID NAME \'class1\' SUP top STRUCTURAL MUST description MAY ( brand $ details $ role ) )
( class2-OID NAME \'class2\' SUP top STRUCTURAL MUST groupname MAY description )
( class3-OID NAME \'class3\' SUP top STRUCTURAL MUST ( code $ name ) )
( class4-OID NAME \'class4\' SUP top STRUCTURAL MUST ( code $ name ) MAY ( group $ description ) )
'
# Print the match result
str.scan(re) do |match|
puts match.to_s
end
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html