我试图解析下面的日志文件;但是我有点卡在弄清楚如何用逗号解析它。
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个字符
/(?:[^\\,]|\\.)+/s
在PHP中:
$regex = '~(?:[^\\,]|\\.)+~s';
细节
(?:
- 非捕获组的开始:
[^\\,]
- 除了\
和逗号之外的任何其他字符
|
- 或
\\.
- 一个\
跟随任何字符包括换行符(由于s
修饰符))+
- 小组结束,重复1次或更多次。一个更有效的正则表达式版本(假设匹配应该以除空格和逗号之外的字符开头):
/(?=[^,\s])[^\\,]*(?:\\.[^\\,]*)*/s
在PHP中:
$regex = '/(?=[^,\s])[^\\\\,]*(?:\\\\.[^\\\\,]*)*/s';
(?=[^,\s])
正向前瞻要求右边的字符是任何字符,但是,
和空格,[^\\,]*(?:\\.[^\\,]*)*
是上面解释的正则表达式的展开等价物。