Regex разбирать запятыми - PullRequest
       9

Regex разбирать запятыми

0 голосов
/ 01 марта 2019

Я пытаюсь разобрать файл журнала ниже;однако я немного застрял в поиске, как разобрать его запятыми.

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 голосов
/ 01 марта 2019

Вы можете сопоставить любые 1+ символов, кроме запятой и обратной косой черты, или любую escape-последовательность, используя

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

В PHP:

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

См. Демонстрационную версию регулярного выражения .

Подробности

  • (?: - начало группы без захвата:
    • [^\\,] - любой символкроме \ и запятой
    • | - или
    • \\. - \, за которым следует любой символ, включая символы разрыва строки (из-за модификатора s)
  • )+ - конец группы, повторите 1 или более раз.

Более эффективная версия регулярного выражения (при условии, что совпадение должно начинаться ссимвол, отличный от пробела и запятой):

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

В PHP:

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

См. это демонстрационное выражение регулярного выражения

* (?=[^,\s]) для положительного взгляда требуется, чтобы символом справа был любой символ, кроме , и пробела, а [^\\,]*(?:\\.[^\\,]*)* - развернутый эквивалент регулярного выражения, объясненного выше.

...