2016-03-18 2 views
-1

Я пытаюсь соответствовать следующей строки для интерфейса к системе безопасности:Извлечение определенных полей с помощью ключевых слов

*3824 04:57:04 24/02/16 ALARM(DC4) Input 1 (SI)Main Door Opened(DC2) 

Пожалуйста, обратите внимание, что (DC4)/(SI)/(DC2) это только визуальное представление символов ASCII так вход на последовательный порт будет представлять собой один байт, а не 4/5 байта.

Система будет непрерывно отправлять сообщения в том же формате, что и выше, и мне нужно будет проверить каждый из них и посмотреть, нужна ли ему дальнейшая обработка.

Слово ALARM - это мое ключевое слово, так что если в него приходит сообщение без ALARM, то я буду игнорировать его (MATCH Failed).

Если в сообщении появляется слово ALARM, то мне нужно получить местоположение события и перейти к другим слоям в моем приложении.

Образец 1 * 3824 4:57:04 24/02/16 ALARM (DC4) Вход 1 (SI) Main Door Открыт (DC2)

Пример 2 * 3824 04:57:04 24/02/16 АВАРИЙНЫЙ СИГНАЛ (DC4) Вход 2 (SI) Задняя дверь открыта (DC2)

Так что мне нужно извлечь все между символами (SI) и (DC2) ASCII в качестве строки для дальнейшей обработки.

Таким образом, сообщение 1 будет соответствовать «Main Door Opened», а Message 2 будет соответствовать «Back Door Open».

Другие слои в приложении затем извлекают эту строку из соответствующего поля Group #, если совпадение имеет успех.

Thanks,

Daniel.

+0

Является ли слово «ALARM» всегда присутствующим? Каким должен быть формат выходной строки? –

ответ

0

Попробуйте это:

([A-Z]+)(?:[^\)]+.){2}([^\(]+) 

Regex101:

Вход:

*3824 04:57:04 24/02/16 ALARM(DC4) Input 1 (SI)Main Door Opened(DC2)

Выход:

MATCH 1 
1. [24-29] `ALARM` 
2. [47-63] `Main Door Opened` 
0

Это точное соответствие в группе 1:

ALARM\(DC4\).*\(SI\)(.*)(?=\(DC2\))