AFAIK, вы не можете выполнять вычисления с использованием регулярных выражений (например, число% 4 == 0?).Таким образом, вам придется использовать шаблон, который получает все возможные комбинации строк.
Попробуйте это: \b[048]\b|\b[13579][26]\b|\b[2468][048]\b|\b1[02][048]\b|\b11[26]\b
\b[048]\b
соответствует 0, 4 и 8 \b[13579][26]\b
соответствует 12, 16, 32, 26 и т. Д. \b[2468][048]\b
соответствует 20, 24, 28, 40, 44, 48 и т. Д. \b1[02][048]\b
соответствует 100, 104, 108, 120, 124, 128 \b11[26]\b
соответствует 112 и 116
Обратите внимание на \b
, который определяет все слово (в вашем случае префикс / суффикс) должен соответствовать шаблону.Без него 136 может соответствовать [13579][26]
, например.
Редактировать: разрешить начальным нулям изменить шаблон на: \b0{0,2}[048]\b|\b0?[13579][26]\b|\b0?[2468][048]\b|\b1[02][048]\b|\b11[26]\b
(обратите внимание, что 0{0,2}
также можно записать как 0?0?
).
Редактировать 2: вы можете избавиться от\b
, если вы разделяете IP-адрес и имеете только строку, содержащую префикс / суффикс.Если после этого вы наберете matches(...)
, у вас все будет в порядке без \b
.
Шаблон для matches(...)
вызовов (без \b
, допускаются начальные нули):
0{0,2}[048]|0?[13579][26]|0?[2468][048]|1[02][048]|11[26]