Php 需要帮助写正则表达式吗

Php 需要帮助写正则表达式吗,php,regex,Php,Regex,以下是我正在处理的一些数据示例(我在旁边做了一些评论): 这些是课程表上的科目。第一个字母代表所教科目。之后是教师姓名的首字母缩写,用空格隔开。最后一个位置是建筑物和房间号 有时,在特定的时间教授几门课程 数据来自ics日历文件,我只是将其复制到这里。还需要考虑新行字符 我需要提取科目名称、教师姓名首字母和房间号,以便我可以使用它。关于如何进行有什么想法吗?一个完整的正则表达式模式将是理想的 我正在使用php 谢谢您的帮助。我将排除这一行: FU MAT \n\nSKU BS06-309 我们

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

这些是课程表上的科目。第一个字母代表所教科目。之后是教师姓名的首字母缩写,用空格隔开。最后一个位置是建筑物和房间号

有时,在特定的时间教授几门课程

数据来自ics日历文件,我只是将其复制到这里。还需要考虑新行字符

我需要提取科目名称、教师姓名首字母和房间号,以便我可以使用它。关于如何进行有什么想法吗?一个完整的正则表达式模式将是理想的

我正在使用php


谢谢您的帮助。

我将排除这一行:

FU MAT \n\nSKU BS06-309
我们这里有什么

  • FU
    :主题
  • MAT
    :老师
  • SKU
    :?
  • BS06-309
    :房间
解决方案:

(?:\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 |
+-------+----------+---------+----------+
无论如何,对于块的其余部分,您可以使用此正则表达式:

(?:\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 |
+-------+----------+---------+----------+

改进它

有时也有罗马数字:
engi.
engii


我假设您只使用从1到39的数字,这就是为什么我只使用
[IVX]
。您可以通过添加
L
C
M
来改进此部分。。。或者使用。

为什么主题后面有时有点,有时没有?到目前为止,你提出了什么?我不知道这个点。有时候它就在那里。这就是我到目前为止所做的:$string=trim(preg_replace('/\s\s+/','$summary))$片段=分解(“,$string);//它的不一致性确实特别难以为每个案例获得好的结果。你能更详细地解释一下第一个特例吗?不同的信息用空格隔开。新行只是格式化而已。