Пожалуйста, прочитайте, прежде чем отмечать дубликаты
Мне не удалось создать или найти RegEx, который работает для всех форматов IPv6 (мои тестовые примеры ниже). Я знаю об этом вопросе, который каждый указывает на: Регулярное выражение, которое соответствует действительным адресам IPv6 Однако все они объединяют IPv6 с IPv4 и/или не работают со всем моим тестом случаев.
Требования:
- Я не хочу, чтобы он также проверял значения IPv4, у меня уже есть отдельная функция проверки для IPv4.
- Мне нужен шаблон, который работает в
Coldfusion
и шаблон, который работает вPL/SQL
. - Поскольку я использую его в
PL/SQL
, шаблон для него должен оставаться под 512 символами. И Oracle поддерживает только узкую часть языка RegExp. Таким образом, шаблонColdfusion
может отличаться от шаблонаPL/SQL
, это нормально, если они оба работают. - Конечный результат не должен быть длинным RegEx, его можно разделить.
Вот последний образец, который я пробовал:
^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$
Это приближается для Coldfusion
, но не 100%. Это не работает вообще в PL/SQL
.
Результаты тестов http://regex101.com/r/wI8cI0 Элементы полужирный - это те, не работает в Coldfusion
:
- матч
- матч
- матч
- матч
- матч
- соответствие (но @Michael Hampton говорит, что это не должно совпадать, потому что это не действительный IPv6-адрес, но другие сказали мне, что он действителен, поэтому я не уверен в этом случае.)
- match (
::
- действительно действительный формат, спасибо @Sander Steffann.) - матч
- нет соответствия
- матч
- нет соответствия
- нет соответствия
- нет соответствия
- матч
- матч
- нет соответствия
- нет соответствия
- нет соответствия
- нет соответствия
Я получил тестовые примеры 8-11: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzai2%2Frzai2ipv6addrformat.htm И сказали: Test 9 и 11 предназначены для префикса адреса IPv6, а не для IPv6-адреса, поэтому они не должны совпадать.
Конечный результат, мне нужно, чтобы они работали в таких выражениях:
ColdFusion:
<cfset IndexOfOccurrence1=REFind("^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$",value[i])>
PL/SQL:
if ( REGEXP_LIKE(v,'^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$','i') ) then