用于解析复杂格式的字符串的体面方式

时间:2014-05-07 14:17:03

标签: 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 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),虽然我可以说服切换到别的东西。 如果您需要,可以在此处找到测试文件:http://www.filedropper.com/compiled11-26-13

谢谢!

0 个答案:

没有答案