【问题标题】:Regex parse by commas正则表达式用逗号解析
【发布时间】:2019-02-28 22:23:46
【问题描述】:

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

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

【问题讨论】:

  • $explodedList = explode(',', $message);
  • 我认为preg_split('~(?<!\\\\)(?:\\\\{2})*\K,~', $s) 可能适合你。它只匹配那些没有转义的逗号。它支持在未转义的逗号之前任意数量的转义反斜杠。
  • 嗨@WiktorStribiżew,是否可以纯粹在正则表达式中做到这一点?
  • 您的意思是在 preg_match_all 中使用正则表达式吗?试试'~(?:[^\\\\,]|\\\\.)+~s'。注意四个反斜杠。不知道单词边界是否适合你,我暂时删除了它们。
  • 嗨@WiktorStribiżew,它似乎抓住了指定和重试regex101.com/r/rYogFv/1之间的逗号

标签: php regex pcre


【解决方案1】:

您可以匹配除逗号和反斜杠之外的任何 1+ 字符,或使用任何转义序列

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

在 PHP 中:

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

请参阅regex demo

详情

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

一个更有效的正则表达式版本(假设匹配应该以字符开头,而不是空格和逗号):

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

在 PHP 中:

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

this regex demo

(?=[^,\s]) 正向前瞻要求右侧的 char 是除 , 和空格之外的任何字符,[^\\,]*(?:\\.[^\\,]*)* 是上述正则表达式的展开等效项。

【讨论】:

  • 感谢 Wiktor,这正是我想要的!
猜你喜欢
  • 2021-09-17
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
相关资源
最近更新 更多