正则表达式用逗号解析

时间:2019-02-28 22:23:47

标签: php regex pcre

我正在尝试解析下面的日志文件;但是我有点想弄清楚如何用逗号解析它。

NOTICE Failed-Attempt: EAP session timed out, ACSVersion=acs-1.6.0.10-B.153.x86_64, ConfigVersionId=100, UserName=username, NAS-IP-Address=10.10.10.10, Calling-Station-ID=0123.4a56.78b9, NAS-Port-Id=123, AcsSessionID=host/123/321, AuthenticationIdentityStore=AD1, AuthenticationMethod=AuthMethod, SelectedAccessService=Wireless, DetailedInfo=Invalid username or password specified\, Retry is  allowed, FailureReason=24421 

我尝试了以下解析方法,但是它没有返回预期的结果:(?:[^,] +)

理想的目标是匹配以下内容:

NOTICE Failed-Attempt: EAP session timed out
ACSVersion=acs-1.6.0.10-B.153.x86_64
UserName=username
NAS-IP-Address=10.10.10.10
Calling-Station-ID=0123.4a56.78b9
NAS-Port-Id=123
AcsSessionID=host/123/321
AuthenticationIdentityStore=AD1
AuthenticationMethod=AuthMethod
SelectedAccessService=Wireless
DetailedInfo=Invalid username or password specified, Retry is allowed
FailureReason=24421

1 个答案:

答案 0 :(得分:1)

您可以匹配除逗号和反斜杠以外的任意1个以上的字符,或使用

/(?:[^\\,]|\\.)+/s

在PHP中:

$regex = '~(?:[^\\,]|\\.)+~s';

请参见regex demo

详细信息

  • (?:-一个非捕获组的开始:
    • [^\\,]-除\和逗号之外的任何字符
    • |-或
    • \\.-一个\,后跟任何包含换行符的字符(由于s修饰符)
  • )+-组结束,重复1次或更多次。

更有效的regex版本(假设匹配应以空格和逗号以外的其他字符开头):

/(?=[^,\s])[^\\,]*(?:\\.[^\\,]*)*/s

在PHP中:

$regex = '/(?=[^,\s])[^\\\\,]*(?:\\\\.[^\\\\,]*)*/s';

请参见this regex demo

(?=[^,\s])正向查找要求将char右边的字符设为,和空格之外的任何char,并且[^\\,]*(?:\\.[^\\,]*)*是上述正则表达式的展开等价物。