Last active
April 10, 2024 07:31
-
-
Save johnelliott/cf77003f72f889abbc3f32785fa3df8d to your computer and use it in GitHub Desktop.
uuid v4 regex
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { v4 as uuid } from 'uuid'; | |
export function generateId() { | |
return uuid(); | |
} | |
const v4 = new RegExp(/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i); | |
console.log(generateId().match(v4)); | |
//console.log(generateId().length) | |
//console.log('new way') | |
//console.log(generateId().length) | |
//console.log('new way, chopped') | |
//console.log(generateId().split('-')[0]) | |
//console.log('old way') | |
//const generateNumber = () => Math.ceil(Math.random() * 100) | |
//console.log(`${generateNumber()}${generateNumber()}${generateNumber()}${generateNumber()}`) | |
// run with $ node_modules/.bin/babel-node testuuid.js |
@juanmartinez-viamericas A capture group (the parentheses) is not allowed in a range (the brackets), so your regex allows to put parentheses and pipres in uuids. And your "insensitive regex without flag" doesn't allow this range [89ab]
in uppercase.
/^[0-9(a-f|A-F)]{8}-[0-9(a-f|A-F)]{4}-4[0-9(a-f|A-F)]{3}-[89ab][0-9(a-f|A-F)]{3}-[0-9(a-f|A-F)]{12}$/
.test('376)5f8c-e686-4b(9-a85b-7e31|8f4062c') // returns true
// ^ ^ ^
/^[0-9(a-f|A-F)]{8}-[0-9(a-f|A-F)]{4}-4[0-9(a-f|A-F)]{3}-[89ab][0-9(a-f|A-F)]{3}-[0-9(a-f|A-F)]{12}$/
.test('376a5f8c-e686-4b79-A85b-7e31e8f4062c') // returns false
// ^
Using regex to support upper/lowercase is totally bonkers. If you expect it to be uppercase / not, assert that the string is uppercase / not . If you don't know, just normalize your data first. Pointed out by @Mars073 the lower/upper regex also adds unnecessarily complexity that can break things
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The trailing
/i
means a case insensitive search. RE the last two comments.