2014-07-08 6 views
-3

Вот некоторые образцы данных, я работаю с (я сделал некоторые комментарии на стороне):Нужна помощь в написании регулярного выражения

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 

Эти предметы в расписании класса. Первые буквы представляют собой обученный предмет. После этого его инициалы учителей разделяются пробелом. Последняя позиция - номер здания и номера.

Иногда в течение определенного времени учатся несколько предметов.

Данные получены из файла календаря ics, и я просто скопировал его здесь. Также необходимо учитывать новые символы линий.

Мне нужно извлечь имя темы, инициалы учителей и номер комнаты, чтобы я мог работать с ним. Любые идеи о том, как действовать? Полный образ регулярного выражения был бы идеальным.

Я работаю с php.

Благодарим за помощь.

+0

Почему есть точка после темы, а иногда нет? – zessx

+0

С чем вы дошли до сих пор? – rinukkusu

+0

Я не знаю о точке. Его просто там иногда. Это то, что я сделал до сих пор: $ string = trim (preg_replace ('/ \ s \ s + /', '', $ summary)); $ pieces = explode ("", $ string); // его непоследовательность – user3668120

ответ

2

Я исключит эту строку:

FU MAT \n\nSKU BS06-309 

Что мы получили здесь?

  • FU: Тема
  • 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].Вы можете улучшить эту часть, добавив L, C, M ... или используя a real regex for roman numbers.

Смежные вопросы