Hay \p{Script=Latin} (también se puede escribir como \p{sc=Latin} ) y \p{Uppercase} .
Pero actualmente no hay forma de seleccionar una intersección de múltiples conjuntos como /^([ \p{Script=Latin} & \p{Uppercase} ])/ en Perl ≥5.18 o \p{Script=Latin,Uppercase} .
Así que la tarea es encontrar una solución.
Ejemplo de entrada:
const input = [ 'License: GPL!', 'License: WÐFPL!', 'License: None!', ] Salida de ejemplo: ['GPL', 'WÐFPL']
La respuesta podría usar una expresión regular que se vea así, por ejemplo: /^License:\s*(?<abbr>\p{Script=Latin,Uppercase}+)!$/u
No existe una solución ideal para hacerlo, excepto si desea la intersección de clases de caracteres predefinidas. Todo lo que tienes que hacer es usar una negación y clases de caracteres negados:
/^License:\s*([^\P{Script=Latin}\P{Uppercase}]+)!/uEs una lógica de conjunto simple:
A ∩ B = ∁∁(A ∩ B) // complement of a complement is an involution A ∩ B = ∁(∁A ∪ ∁B) // Morgan's law: complement of an intersection is the union // of complementsconst input = [ 'License: GPL!', 'License: WÐFPL!', 'License: None!', ] const regexp = /^License:\s*(?<abbr>(?:(?![ƗØ])(?=\p{Uppercase})\p{sc=Latin})+)!$/u console.log(input.map(str => str.match(regexp)?.groups?.abbr).filter(Boolean))Explicación:
^ License: \s* (?<abbr> // named capture groups (?: // A negative look-ahead assertion. // Exclusion of Ɨ and Ø was not required by the question; // this line is here to provide more examples. (?![ƗØ]) // A look-ahead assertion (looks into the future, // and then always goes back to the former position) (?=\p{Uppercase}) \p{sc=Latin} )+ ) ! $