2015-06-15 3 views
1

исходного выражения повторно даются Mooc инструкторомпитона повторно согласования «пространства в конце строки»

^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (\S+)\s*(\S*)" (\d{3}) (\S+) 

Я думаю, что улов здесь есть дополнительное пространство в конце HTTP/1.0 для плохо кто-нибудь может намекнуть сделать небольшие изменения, чтобы заставить его разобрать BOTH успешно? Я попытался изменить (\ S *) на (?: \ S + | $) или (\ S. *), и это не сработало.

хороший один ниже

127.0.0.1 - - [01/Aug/1995:00:00:01 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1839 

плохой ниже

Invalid logline: ix-li1-14.ix.netcom.com - - [08/Aug/1995:14:47:41 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0 " 200 20304 

ответ

1

Прямой подход

^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (\S+)\s*(\S*)\s?" (\d{3}) (\S+) 

Примечание \s? Перед второй ".

Это соответствует обоим

127.0.0.1 - - [01/Aug/1995:00:00:01 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1839 

и

ix-li1-14.ix.netcom.com - - [08/Aug/1995:14:47:41 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0 " 200 20304 
+0

Спасибо, не могли бы вы прокомментировать, почему (?: \ S + | $) не работает? – Jin

+0

Прежде всего '' 'будет соответствовать концу всей строки, в которой вы передаете не текст внутри' ''. Таким образом, здесь это не имеет смысла. Теперь у нас есть '(?: \ S +)', который равен не- захват '\ s +', и он будет работать только в том случае, если есть хотя бы одно место и должно соответствовать только недопустимому случаю. – lig

+0

Похоже, что '\ s *' будет менее подвержен ошибкам, чем '\ s?' честно. – lig

Смежные вопросы