Php 为复杂格式解析字符串的好方法

Php 为复杂格式解析字符串的好方法,php,regex,parsing,string-parsing,Php,Regex,Parsing,String Parsing,我试图从一个大字符串中解析科学碗问题。 一般格式如下: PART SUBJECT QuestionType Question goes here. ANSWER: Answer goes here. 例如,字符串可能如下所示: A Team Questions 5/7/2014 TOSS-UP 1) PHYSICS Multiple Choice Gravity is 10 m/s^2. How far in meters will an object fired at 10 meters

我试图从一个大字符串中解析科学碗问题。 一般格式如下:

PART
SUBJECT QuestionType Question goes here.
ANSWER: Answer goes here.
例如,字符串可能如下所示:

A Team Questions 5/7/2014

TOSS-UP
1) PHYSICS Multiple Choice Gravity is 10 m/s^2. How far in meters will an object fired at 10 meters per second travel if it is fired at an angle of 22.5 degrees from the horizontal?
W) 5sqrt(2)
X) 10
Y) 10sqrt(2)
Z) 20
ANSWER: W) 5sqrt(2)

BONUS
1) PHYS Short Answer A proton is which of the following:
1) Fermion
2) Hadron
3) Lepton
4) Boson
5) Baryon
ANSWER: 1, 2, 5



TOSS-UP
2) EARTHSCI Short Answer What is the greatest prime factor of 5^2014+5^2015+5^2016+5^2017?
ANSWER: 13

...more tossup/bonus pairs...
下面的正则表达式(简化版本;真正的正则表达式需要由大型PHP函数生成)的精度不到50%。目标是分别捕获每个组件(部分、主题、类型、问题、答案)

/(TOSS-UP|BONUS)\n\s*(?:([0-9]+)[\.\)])?\s*(BIO(?:LOGY)?|CHEM(?:ISTRY)?|PHYS(?:ICS|ICAL(?: SCIENCE)?)?|MATH(?:EMATICS)?|E(?:SS)?(?:ARTH)? ? ?(?:AND)? ?(?:SPACE)? ?(?:SCI(?:ENCE)?)?)\s*(Multiple Choice|Short Answer)\s*([^\n]+)(:?\s*W[\s\S]([^\n]+)\s*X[\s\S]([^\n]+)\s*Y[\s\S]([^\n]+)\s*Z[\s\S]([^\n]+))?\s*\nANSWER[\s\S]([^\n]+)/i
我的问题是,有没有更好的方法来做这件事,而不是用一个拥有大量捕获群的大型正则表达式进行攻击?如果没有,是否有更好的方法方便地编写正则表达式? 还是整个范例都搞砸了,有办法完全避免字符串解析

我使用普通的老PHP(preg_replace),尽管我可以确信我会切换到其他东西。 如果需要,可以在此处找到测试文件:

谢谢大家!

用这个