From b23052753fb62cd6aa0232c48e3dc6b05a1b6d12 Mon Sep 17 00:00:00 2001 From: Pratyush Kumar Date: Mon, 20 Oct 2025 03:14:07 +0530 Subject: [PATCH 1/2] fix(regex): correct IP validation to handle IPv4 edge cases and robust IPv6 --- .../IP Address Validation/README.md | 35 +++++++++---------- .../getIP4OrIPV6address.js | 23 ++++++++++-- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/Specialized Areas/Regular Expressions/IP Address Validation/README.md b/Specialized Areas/Regular Expressions/IP Address Validation/README.md index 285bce4703..9d9c8adf35 100644 --- a/Specialized Areas/Regular Expressions/IP Address Validation/README.md +++ b/Specialized Areas/Regular Expressions/IP Address Validation/README.md @@ -1,25 +1,22 @@ -The regex in the file getIP4OrIPV6address.js files validates for both ip address(ipv4) or ipv6 based on the input. +The regex in `getIP4OrIPV6address.js` validates both IPv4 and IPv6 addresses in input text. -This regex cover the folloing IPv6 examples: -Full IPv6 addresses (e.g., 2001:0db8:85a3:0000:0000:8a2e:0370:7334). -Shorthand versions (e.g., fe80::1, where :: represents omitted zeros). -IPv6 with embedded IPv4 addresses (e.g., ::ffff:192.168.1.1). -And also includes following IPv4 addresses. -Following are the valid IP address examples: +IPv6 coverage includes: +- Full addresses like `2001:0db8:85a3:0000:0000:8a2e:0370:7334` +- Compressed forms like `fe80::1` (`::` for omitted zeros) +- IPv4-embedded forms like `::ffff:192.168.1.1` -192.168.1.1 +IPv4 validation now strictly enforces each octet to be in the range 0–255. -127.0.0.1 +Valid IPv4 examples: -0.0.0.0 +- 192.168.1.1 +- 127.0.0.1 +- 0.0.0.0 +- 255.255.255.255 +- 1.2.3.4 -255.255.255.255 - -256.256.256.256 - -999.999.999.999 - -1.2.3 - -1.2.3.4 +Invalid IPv4 examples (correctly rejected by the regex): +- 256.256.256.256 +- 999.999.999.999 +- 1.2.3 diff --git a/Specialized Areas/Regular Expressions/IP Address Validation/getIP4OrIPV6address.js b/Specialized Areas/Regular Expressions/IP Address Validation/getIP4OrIPV6address.js index 2742dcf75b..7b12d2d87b 100644 --- a/Specialized Areas/Regular Expressions/IP Address Validation/getIP4OrIPV6address.js +++ b/Specialized Areas/Regular Expressions/IP Address Validation/getIP4OrIPV6address.js @@ -1,5 +1,24 @@ extractIPAddresses: function(text) { - var ipRegex = /\b((\d{1,3}\.){3}\d{1,3})\b|\b([a-fA-F0-9:]+:+[a-fA-F0-9:]+)\b/g; - var matches = text.match(ipRegex); + var ipv4 = "(?:25[0-5]|2[0-4]\\d|1?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1?\\d?\\d)){3}"; + var ipv6 = "("+ + "(?:[A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}|"+ + "(?:[A-Fa-f0-9]{1,4}:){1,7}:|"+ + "(?:[A-Fa-f0-9]{1,4}:){1,6}:[A-Fa-f0-9]{1,4}|"+ + "(?:[A-Fa-f0-9]{1,4}:){1,5}(?::[A-Fa-f0-9]{1,4}){1,2}|"+ + "(?:[A-Fa-f0-9]{1,4}:){1,4}(?::[A-Fa-f0-9]{1,4}){1,3}|"+ + "(?:[A-Fa-f0-9]{1,4}:){1,3}(?::[A-Fa-f0-9]{1,4}){1,4}|"+ + "(?:[A-Fa-f0-9]{1,4}:){1,2}(?::[A-Fa-f0-9]{1,4}){1,5}|"+ + "[A-Fa-f0-9]{1,4}:(?:(?::[A-Fa-f0-9]{1,4}){1,6})|"+ + ":(?:(?::[A-Fa-f0-9]{1,4}){1,7}|:)|"+ + "fe80:(?::[A-Fa-f0-9]{0,4}){0,4}%[0-9A-Za-z]{1,}|"+ + "::(?:ffff(?::0{1,4}){0,1}:){0,1}(?:"+ + "(?:25[0-5]|2[0-4]\\d|1?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1?\\d?\\d)){3}"+ + ")|"+ + "(?:[A-Fa-f0-9]{1,4}:){1,4}:(?:"+ + "(?:25[0-5]|2[0-4]\\d|1?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1?\\d?\\d)){3}"+ + ")"+ + ")"; + var ipRegex = new RegExp("\\b(?:" + ipv4 + "|" + ipv6 + ")\\b","g"); + var matches = text.match(ipRegex); return matches; }, From 2b4c50dc83e0eacb6849013aaf40b1d0563b73ce Mon Sep 17 00:00:00 2001 From: Pratyush Kumar Date: Mon, 20 Oct 2025 04:26:37 +0530 Subject: [PATCH 2/2] enhance(regex): improve IP extractor to prevent false positives and enforce IPv4 octet ranges Tighten IPv4 pattern to enforce 0-255 per octet, rejecting invalid addresses like 256.256.256.256 and 999.999.999.999 Replace loose IPv6 matcher with comprehensive pattern covering full, compressed, link-local with zone IDs, and IPv4-embedded forms --- .../Regular Expressions/IP Address Validation/README.md | 4 +++- .../IP Address Validation/getIP4OrIPV6address.js | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Specialized Areas/Regular Expressions/IP Address Validation/README.md b/Specialized Areas/Regular Expressions/IP Address Validation/README.md index 9d9c8adf35..d67a83cc66 100644 --- a/Specialized Areas/Regular Expressions/IP Address Validation/README.md +++ b/Specialized Areas/Regular Expressions/IP Address Validation/README.md @@ -1,4 +1,6 @@ -The regex in `getIP4OrIPV6address.js` validates both IPv4 and IPv6 addresses in input text. +This snippet extracts IPv4 and IPv6 addresses from free text. For single-value validation, see `validateIPInput.js` and `Validate IPv6 Address/script.js`. + +The regex in `getIP4OrIPV6address.js` finds both IPv4 and IPv6 addresses within arbitrary text content. IPv6 coverage includes: - Full addresses like `2001:0db8:85a3:0000:0000:8a2e:0370:7334` diff --git a/Specialized Areas/Regular Expressions/IP Address Validation/getIP4OrIPV6address.js b/Specialized Areas/Regular Expressions/IP Address Validation/getIP4OrIPV6address.js index 7b12d2d87b..71275dbea1 100644 --- a/Specialized Areas/Regular Expressions/IP Address Validation/getIP4OrIPV6address.js +++ b/Specialized Areas/Regular Expressions/IP Address Validation/getIP4OrIPV6address.js @@ -1,3 +1,5 @@ +// Extracts IPv4 and IPv6 addresses from arbitrary text content +// For single-value validation, use validateIPInput.js or Validate IPv6 Address/script.js extractIPAddresses: function(text) { var ipv4 = "(?:25[0-5]|2[0-4]\\d|1?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1?\\d?\\d)){3}"; var ipv6 = "("+