2

我正在尝试为自定义警报监视文本和电子邮件警报系统捕获特定值,并且取得了一定的成功。但是,有时提供给我的引擎的数据可能有点零星,因此我当前的正则表达式系统会失败。

例如,以下是我在电子邮件中收到的内容以及可以获取的格式的示例:

例子:

CS#: A192255
Site Name: Home Alarm
Date and Time: Oct  1 2012  7:37AM                                       =
   User #: 17
User Name: User# 17                                               Event: =
CEE400 - OPEN                                               Zone: E401 - =
Caller_ID:  =0A=
=0D 

我曾经逐行读取文件,效果很好,但是有些项目会在同一行,这让我大吃一惊。现在我阅读了整个电子邮件文件并搜索我感兴趣的项目。

我正在使用以下 REGEX 项目来查找相关对象。有些人使用 : 分隔符,但正如您通过 EVENT 看到的那样,该值最终位于下一行,这使我的正常正则表达式变得混乱。

正则表达式

>/CS#:(.*?)A[0-9]{6}/
/Site Name:(.*?)[a-zA-Z0-9\'\"\-\_\[\]\s]{0,30}[\r\n]/
/Date and Time:(.*?)[a-zA-Z]{3}(.*?)[0-9]{1,2}(.*?)[0-9]{4}(.*?)[0-9]{1,2}:[0-9]{2}[a-zA-Z]{2}/
/CEE[0-9]{3}|CIE[0-9]{3}/ - For the EVENT: line
/Zone:(.*?)[0-9]{1,3}[a-zA-Z0-9\s\'\"\-\_\[\]\s]{0,50}+/
"/User #:(.*?)[0-9]{1,3}/

在这个特定的问题上,我让 SITE NAME 项目寻找一串字符,最多 30 个或直到它遇到换行符。这似乎有效,然后我收到了以下电子邮件,它捕获了 '=20' 字符。

示例 2

CS#: A197789
Site Name: Made up name (F/A)
111E 1st Street=20
Somewhere, AZ 99999
Date and Time: Oct  1 2012  9:14AM
Event: CEE602 - TIMER TEST
Zone: E602 -  Caller_ID: timer test
Site Phone 1: 
Site Phone 2:=20
System Description: NX 8 Caddx LF=0A=
=0D 

如果有人可以查看我头脑简单的正则表达式项目并帮助我找到更好的解决方案,我将不胜感激!

4

1 回答 1

0

这是上述解决方案的 Rubular 演示,使用您的示例:

\s*([^:]+?)\s*:\s*(.*(?:\s*(?!.*:).*)*)\s*

编辑:

这里有一些 PHP 代码可以给你一个想法:

$str = 'CS#: A197789
Site Name: Made up name (F/A)
111E 1st Street=20
Somewhere, AZ 99999
Date and Time: Oct 1 2012 9:14AM
Event: CEE602 - TIMER TEST
Zone: E602 - Caller_ID: timer test
Site Phone 1: 
Site Phone 2:=20
System Description: NX 8 Caddx LF=0A=
=0D';

preg_match_all('/\s*([^:]+?)\s*:\s*(.*(?:\s*(?!.*:).*)*)\s*/m',
               $str,
               $matches,
               PREG_SET_ORDER);

foreach ($matches as $match) {
    echo "$match[1] => $match[2] <br>";
}

输出:

CS# => A197789
Site Name => Made up name (F/A)
111E 1st Street=20 Somewhere, AZ 99999 Date and Time => Oct 1 2012 9:14AM
Event => CEE602 - TIMER TEST
Zone => E602 - Caller_ID: timer test
Site Phone 1 =>
Site Phone 2 => =20
System Description => NX 8 Caddx LF=0A= 

我留给您尝试解决“日期和时间:”问题...(提示:上午 9 点 14 分)

于 2012-10-01T18:57:08.487 回答