re = /<!ELEMENT\s+
((?'elname'\S+)\s+)
((?'rank'\d+)\s+)?
(?'tagOmit'
(?'start'[-oO])\s+
(?'end'[-oO])\s+
)?
(?'content'
(?'keyword'(ANY|EMPTY|CDATA|RDATA))|
(?'contentGrp' \(.*\)[*+?]?)
)
(?'exceptions'
(\s+\-(?'exclusion'\(.+\)))?
(\s+\+(?'inclusion'\(.+\)))?
)
\s*>/mx
str = '<!ELEMENT FTNOTE - - ((PARA | PARA-EFF-GROUP | PARA-EFF-CHOICE | TABLE | UN-LIST | NOTE | TABLE-EFF-GROUP | TABLE-EFF-CHOICE)+)
-(FTNOTE | NOTE | TABLE | GROUND-TEST | CORRECTIVE-ACTION)>
<!ELEMENT ENTRY - - (WARNING | CAUTION | NOTE | (PARA | UN-LIST | PARA-EFF-GROUP | PARA-EFF-CHOICE)*)
-(ENTRY | GRAPHIC-COLLECTION)
+(INFOMARK | FTNOTE-REF)>
<!ELEMENT COLSPEC - o EMPTY>
<!ELEMENT TGROUP - - (COLSPEC+, THEAD?, TBODY)>
<!ELEMENT TABLE - - (TITLE?, TGROUP, FTNOTE*)
-(TABLE | TABLE-NO-TITLE | GROUND-TEST | CORRECTIVE-ACTION)
+(INFOMARK | INCLUDED-SUBDOC | INCLUDED-SOURCE-DATA | EFF-NONE)>'
# 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