У меня есть шаблон, который приведен ниже, чтобы соответствовать IPv4-адрес в десятичной записи с точками.
IPV4ADDRESS (([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))
и я использую
%x S_rule S_dst_ip
<S_rule>(dst-ip){SPACE} {
BEGIN(S_dst_ip);
}<S_dst_ip>\{{IPV4ADDRESS}\} {
/*code to process the sring here.*/
}
соответствовать вводу формы
dst-ip {10.13.12.138}
Теперь я хочу соответствовать
dst-ip { 10.13.12.138 } in addition to dst-ip {10.13.12.138}
Я изменяю IPV4ADDRESS, определенный выше, следующим образом
IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))[ \t]*
Однако эта модификация, кажется, не соответствует
dst-ip { 10.13.12.138 } OR dst-ip {10.13.12.138}
Может кто-то указать на ошибку в моем коде?
Поскольку это «работает для меня», я не могу сказать вам, что не так с вашим кодом, так как вы не показали SSCCE (Короткий, самостоятельный, правильный пример). Вот один из них:
/*IPV4ADDRESS (([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))*/
IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))[ \t]*
SPACE [ \t]
%x S_rule S_dst_ip
%%
%{
BEGIN S_rule;
%}
<S_rule>(dst-ip){SPACE} {
BEGIN(S_dst_ip);
}
<S_dst_ip>\{{IPV4ADDRESS}\} {
printf("\n\nMATCH [%s]\n\n", yytext);
BEGIN S_rule;
}
. { ECHO; }
%%
int main(void)
{
while (yylex() != 0)
;
return(0);
}
int yywrap(void)
{
return 1;
}
Использование файла тестовых данных на основе текста из вашего вопроса:
dst-ip {10.13.12.138}
dst-ip { 10.13.12.138 }
dst-ip {10.13.12.138}
dst-ip { 10.13.12.138 } OR dst-ip {10.13.12.138}
Программа выше производит (некоторые пустые строки пропущены):
MATCH [{10.13.12.138}]
MATCH [{ 10.13.12.138 }]
MATCH [{10.13.12.138}]
MATCH [{ 10.13.12.138 }]
OR
MATCH [{10.13.12.138}]
Если бы мне пришлось угадывать, что происходит не так, я бы заподозрил, что вам не хватает переключателя обратно в состояние S_rule
после признания S_dst_ip
(и, возможно, открытие %{ BEGIN S_rule; %}
фраза тоже).
Попутно отмечаю, что это примет {999.999.999.999}
как адрес IPv4. Тем не менее, это возможно исправить с помощью более строго контролируемого выражения, и это не относится к вашей основной проблеме.
Других решений пока нет …