Регулярное выражение "не содержит" - PullRequest
1 голос
/ 20 марта 2020

Я строю какой-то базовый c синтаксический анализ журнала и не могу найти способ сделать это регулярное выражение правильным. Я хочу, чтобы каждое регулярное выражение соответствовало только одному из журналов ниже. Первый из перечисленных - это тот, который не работает, а остальные приведены в качестве примеров того, что работает.

Я предоставил образец журнала, использованное регулярное выражение и то, что он возвращает. Любая помощь будет принята с благодарностью

В этих примерах: первое регулярное выражение для сопоставления, если в журнале нет «\» или «@» до или после входа в систему. Второе регулярное выражение будет сопоставлять журналы с «\» перед входом в систему. Третье регулярное выражение будет сопоставлять журналы с «@» после входа в систему

Log:

04:52:59,1,"bob"theRestOfTheLog

Регулярное выражение:

[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2},[0-9]{1,3},"(^(?!.*?\\|.*?@)<login>[^"])

Нет совпадений, Хотите вернуть:

login=bob

Журнал:

04:52:59,1,"abc\bob"theRestOfTheLog

Регулярное выражение:

[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2},[0-9]{1,3},"(?<domain>[^\\]+)\\(?<login>[^"]+)

Возвращает:

domain=abc login=bob

Журнал:

04:52:59,1,"bob@xyz.org"theRestOfTheLog

Регулярное выражение:

[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2},[0-9]{1,3},"(?<login>[^@]+)@(?<domain>[^"]+)

Возвращает:

login=bob domain=xyz.org

1 Ответ

2 голосов
/ 20 марта 2020

Я думаю, что для первого регулярного выражения вы могли бы использовать exclude, совпадающее с \ и @ для входа в систему, чтобы получить это как единственное совпадение и не совпадать с другими.

[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2},[0-9]{1,3},"(?<login>[^"\\@]+)"

Regex demo

Обратите внимание, что при использовании отрицательного класса символов [^"\\@] он также будет соответствовать символам новой строки. Если вы не хотите сопоставлять их, вы можете расширить его до [^"\\@\r\n]

Если вы не хотите, чтобы символы новой строки или пробелы использовали \s вместо \r\n

...