需要帮助编写正则表达式

时间:2014-07-08 07:50:25

标签: php regex

以下是我正在处理的数据的一些示例(我在旁边做了一些评论):

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。

感谢您的帮助。

1 个答案:

答案 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)*

Regular expression visualization

详细信息:

(?:\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]。您可以改进此部分,添加LCM ...或使用a real regex for roman numbers