re = /# Find the company at the beginning of the line, always:
^ COMPANY:(?P<company>[^\s|]+(?:[ ][^\s|]+)*)
# After COMPANY, any of PERSON or PRODUCT may be matched:
|\G [^\S\r\n]*[|][^\S\r\n]*
PERSON:(?P<person>[^\s|]+(?:[ ][^\s|]+)*)
|\G [^\S\r\n]*[|][^\S\r\n]*
PRODUCT:(?P<product>[^\s|]+(?:[ ][^\s|]+)*)/mx
str = 'COMPANY:Pizza
COMPANY:Pizza
COMPANY:Pizza | PERSON:Sid Sanders | PERSON:Louise Lane | PRODUCT:Bananas
COMPANY:Pizza |PERSON:Sid Sanders | PERSON:Louise Lane| PRODUCT:Bananas
COMPANY:Pizza| PERSON:Sid Sanders | PERSON:Louise Lane|PRODUCT:Bananas
COMPANY:Pizza|PERSON:Sid Sanders | PERSON:Louise Lane |PRODUCT:Bananas
COMPANY:Food Heaven
COMPANY:Food 123 Heaven
COMPANY:Food Heaven | PRODUCT:Bananas | PERSON:Sid Sanders | PERSON:Louise Lane
COMPANY:Food Heaven123| PRODUCT:Bananas |PERSON:Sid Sanders | PERSON:Louise Lane
COMPANY:Food Heaven| PERSON:Sid Sanders | PERSON:Louise Lane | PRODUCT:Bananas
COMPANY:Food Heaven|PERSON:Sid Sanders| PRODUCT:Bananas | PERSON:Louise Lane
COMPANY:Something Somewhere Anywhere - There
COMPANY:Something 1 Soöômewhere Anywhere There
COMPANY:Something 2 Somewhere - Anywhere There | PERSON:Sid Sanders | PRODUCT:Bananas| PERSON:Louise Lane
COMPANY:Something - Somewhere Anywhere There |PERSON:Sid Sanders| PRODUCT:Bananas | PERSON:Louise Lane
COMPANY:- Something 3 Somewhere Anywhere There| PERSON:Sid Sanders |PRODUCT:Bananas | PERSON:Louise Lane
COMPANY:Something Somewhere 4 Anywhere There|PERSON:Sid Sanders | PRODUCT:Bananas | PERSON:Louise Lane
# Should not match:
|PERSON:Fred Rogers
| PRODUCT:Mr. Roger\'s Neighborhood
# Should start matching again:
COMPANY:Fred Rogers Productions |PERSON:Fred Rogers |PRODUCT:Mr. Roger\'s Neighborhood
'
# 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