以下是我正在处理的数据的一些示例(我在旁边做了一些评论):
TSG MUM \n\nBS06-312
RQWE. FKB \n\nBS06-204
NM. JAK \n\nBS06-E05
DB. FKB \n\nBS06-312
IGT. resetk \n\nWender. //--> special CASE
ENG I. \n\nWEHN BS06-E06 \n\nENG II \n\nFLEM BS06-203 //--> special CASE: 2 Subjects
ITSI. MUM \n\nBS06-E02
PQT. RIE \n\nBS11-QCR PQT \n\nMARK BS11-QCR \n\nPQT FIS \n\nBS11-QCR //--> special CASE: several Subjects
INC FEY \n\nBS06-309
FU MAT \n\nSKU BS06-309
ABS. DOE \n\nBS06 ABS \n\nVOG BS06 \n\nABS HEI \n\nBS06 ABS \n\nMOR BS06 \n\nABS REM \n\nBS06 ABS \n\nDEI BS06 \n\nABS THA \n\nBS06
ENG III. \n\nGLIT BS06-209 \n\nENG II \n\nWANN BS06-208
这些是课程表中的科目。第一个字母代表教学科目。之后,它的教师名字由一个空格隔开。最后一个位置是建筑物和房间号。
有时在特定时间教授几门科目。
数据来自一个日历文件,我只是在这里复制它。还需要考虑新的行字符。
我需要提取主题名称,教师姓名缩写和房间号码,以便我可以使用它。关于如何进行的任何想法?完整的正则表达式模式将是理想的。
我正在使用php。
感谢您的帮助。
答案 0 :(得分:2)
我将排除这一行:
FU MAT \n\nSKU BS06-309
我们在这里有什么?
FU
:subject MAT
:老师SKU
:??? BS06-309
:房间解决方案:
无论如何,对于块的其余部分,您可以使用此正则表达式:
(?:\s|\\n\\n)*(?<subject>\S+(?:\s[IVX]+\.?)?)(?:\s|\\n\\n)+(?<teacher>\S+)(?:\s|\\n\\n)+(?<room>\S+)(?:\s|\\n\\n)*
详细信息:
(?:\s|\\n\\n)* # spaces or \n\n - not caught
(?<subject>\S+(?:\s[IVX]+\.?)?) # non-spaces plus I., II., III, IV... -> subject
(?:\s|\\n\\n)+ # spaces or \n\n - not caught
(?<teacher>\S+) # non-spaces -> teacher
(?:\s|\\n\\n)+ # spaces or \n\n - not caught
(?<room>\S+) # non-spaces -> room
(?:\s|\\n\\n)* # spaces or \n\n - not caught
结果:
+-------+----------+---------+----------+
| MATCH | SUBJECT | TEACHER | ROOM |
+-------+----------+---------+----------+
| 1 | TSG | MUM | BS06-312 |
| 2 | RQWE. | FKB | BS06-204 |
| 3 | NM. | JAK | BS06-E05 |
| 4 | DB. | FKB | BS06-312 |
| 5 | IGT. | resetk | Wender. |
| 6 | ENG I. | WEHN | BS06-E06 |
| 7 | ENG II | FLEM | BS06-203 |
| 8 | ITSI. | MUM | BS06-E02 |
| 9 | PQT. | RIE | BS11-QCR |
| 10 | PQT | MARK | BS11-QCR |
| 11 | PQT | FIS | BS11-QCR |
| 12 | INC | FEY | BS06-309 |
| 13 | ABS. | DOE | BS06 |
| 14 | ABS | VOG | BS06 |
| 15 | ABS | HEI | BS06 |
| 16 | ABS | MOR | BS06 |
| 17 | ABS | REM | BS06 |
| 18 | ABS | DEI | BS06 |
| 19 | ABS | THA | BS06 |
| 20 | ENG III. | GLIT | BS06-209 |
| 21 | ENG II | WANN | BS06-208 |
+-------+----------+---------+----------+
试一试:
<强> Demo 强>
改善它!
有时会有罗马数字:ENG I.
,ENG II
...
我假设你只有1到39的数字,这就是为什么我只使用[IVX]
。您可以改进此部分,添加L
,C
,M
...或使用a real regex for roman numbers。