Определение GPL лицензий используя RegEx (Регулярные выражения)

Как определить GPL лицензии, по типу GPL-3.0, AGPL-3.0, LGPL-3.0 и т.п. используя regex (регулярные выражения)?

Условия:

  1. Вместо черты(-) у лицензий может быть символ v или даже version. Пример: GPLv3.0
  2. В строке с лицензией могут быть пробелы. Пример: GPL 3.0
  3. В части с версией лицензии может не участвовать .0. Пример: GPL-3;
  4. Также GPL может быть написана маленькими буквами / нижним кейсом (НЕ учитывайте варианты по типу Gpl, gPl и т.п.). Пример: gpl-3.0

Мой вариант в ответе ниже.


Ответы (2 шт):

Автор решения: ΝNL993

Определение лицензии GPL-3.0:

var pattern = /^(?!:L)^(?!:A)(GPL|gpl)( )?(( )?(-)?(v)?(version)?)( )?3(\.0)?/

console.log('GPL-3.0'.match(pattern))
console.log('GPLv3.0'.match(pattern))
console.log('GPL version 3'.match(pattern))
console.log('gpl-3.0'.match(pattern))

console.log('AGPL-3.0'.match(pattern)) // null
console.log('LGPL-3.0'.match(pattern)) // null
console.log('Gpl-3.0'.match(pattern)) // null
console.log('gplv2.0'.match(pattern)) // null

Объяснение:

Для начала идёт проверка, является ли лицензия AGPL или LGPL, и если является то, возвращает null, также в этой части (GPL|gpl) разные кейсы, чуть позже идёт проверка на пробел и на то какой разделитель между названием лицензии и версией, снова проверка на пробел, и в самом конце идёт проверка является ли версия лицензии 3 и есть ли у версии лицензии .0 на конце.

И дальше по накатанной

AGPL-3.0:

var pattern = /(AGPL|agpl)( )?(( )?(-)?(v)?(version)?)( )?3(\.0)?/

console.log('AGPL-3.0'.match(pattern))
console.log('AGPLv3.0'.match(pattern))
console.log('AGPL version 3'.match(pattern))
console.log('agpl-3.0'.match(pattern))

console.log('LGPL-3.0'.match(pattern)) // null
console.log('LGPL-3.0'.match(pattern)) // null
console.log('Gpl-3.0'.match(pattern)) // null
console.log('gplv2.0'.match(pattern)) // null

LGPL-3.0:

var pattern = /(LGPL|lgpl)( )?(( )?(-)?(v)?(version)?)( )?3(\.0)?/

console.log('LGPL-3.0'.match(pattern))
console.log('LGPLv3.0'.match(pattern))
console.log('LGPL version 3'.match(pattern))
console.log('lgpl-3.0'.match(pattern))

console.log('AGPL-3.0'.match(pattern)) // null
console.log('AGPL-3.0'.match(pattern)) // null
console.log('Gpl-3.0'.match(pattern)) // null
console.log('gplv2.0'.match(pattern)) // null

Объяснение:

В последних двух примерах просто убрана проверка на то является ли лицензия AGPL или LGPL, и просто уточнено какая именно лицензия нужна(см. в коде).

→ Ссылка
Автор решения: EzioMercer

Я бы по-проще сделал)) Наверное есть варианты, когда можно это сломать, но вроде на тех примерах, что вы предоставили он отработал на ура:

var pattern = /\b(A|L|)(GPL|gpl)( |-|v| version )3(\.0)?/;

console.log(pattern.test('GPL-3.0'), 'GPL-3.0');
console.log(pattern.test('GPLv3.0'), 'GPLv3.0');
console.log(pattern.test('GPL version 3'), 'GPL version 3');
console.log(pattern.test('gpl-3.0'), 'gpl-3.0');

console.log(pattern.test('AGPL-3.0'), 'AGPL-3.0');
console.log(pattern.test('LGPL-3.0'), 'LGPL-3.0');
console.log(pattern.test('Gpl-3.0'), 'Gpl-3.0');
console.log(pattern.test('gplv2.0'), 'gplv2.0');

console.log(pattern.test('AGPLv3.0'), 'AGPLv3.0');
console.log(pattern.test('AGPL version 3'), 'AGPL version 3');
console.log(pattern.test('agpl-3.0'), 'agpl-3.0');

console.log(pattern.test('LGPLv3.0'), 'LGPLv3.0');
console.log(pattern.test('LGPL version 3'), 'LGPL version 3');
console.log(pattern.test('lgpl-3.0'), 'lgpl-3.0');

Если надо их достать именно из текста:

const text = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ac nibh accumsan, imperdiet ante non, porta tellus. Mauris fermentum nunc dui, eget elementum velit viverra non. Mauris ac leo eget arcu fringilla imperdiet. Curabitur non purus felis. Mauris urna elit, GPL-3.0 cursus vehicula sed, finibus in ante. Sed volutpat sed sem vitae consequat. Fusce lacus nunc, euismod eu efficitur a, mollis a est. Etiam placerat elementum nibh, ac vehicula sapien viverra eu. Aenean agpl-3.0, mauris sit amet facilisis consectetur, sapien orci varius lorem, sit amet efficitur odio libero nec libero. Vestibulum commodo, nisl quis consectetur laoreet, neque lorem venenatis mi, eget vestibulum nunc massa suscipit nisl. Mauris sodales feugiat mi, vitae egestas lacus iaculis vestibulum. Ut ut mi vitae urna dignissim gravida sit amet id erat. Integer nec risus quis AGPLv3.0 euismod placerat. Mauris vel auctor dui, eu sagittis diam. Praesent eget lacinia augue. Sed ut lorem purus.

Nullam non dignissim turpis, ac fringilla lectus. Sed cursus neque eget consequat mollis. Quisque suscipit erat in urna iaculis, ultricies facilisis purus sagittis. In tristique sapien et rutrum convallis. Cras eu turpis maximus, commodo massa vitae, iaculis metus. Nam bibendum gplv2.0 purus, at scelerisque libero. Quisque a sem urna. Proin consequat interdum turpis a dapibus. Phasellus maximus GPL version 3 neque, a dapibus ipsum LGPL-3.0 vel. Mauris vel sapien in quam rutrum sagittis sed sit amet massa. Proin sagittis, mi eu finibus interdum, sapien nibh egestas augue, quis dapibus sem sem id orci. Nunc vitae pretium ipsum. In hendrerit, purus vitae commodo Gpl-3.0, felis massa iaculis leo, non viverra ipsum augue id ligula.`;

const regexp = /\b(A|L|)(GPL|gpl)( |-|v| version )3(\.0)?/g;

console.log(text.match(regexp));

→ Ссылка