Tengo una serie de cadenas como esta:
["Author Name, (p. 123). (2019). Company.", "Author Name, (p. 321). (2021). Company."] ¿Cómo puedo devolver los números de página que comienzan con y contienen el patrón (p. ?
Hasta ahora he probado /\(([^)\)]+)\)/ sin embargo, devuelve todo entre paréntesis. Solo quiero los números de página entre paréntesis.
Puedes hacer coincidir la p. antes del grupo de captura y capturar los números. No es necesario escapar del paréntesis en la clase de caracteres, por lo que puede eliminar \) y dejar solo )
\(p\.\s*([^)]+)\)Vea una demostración de expresiones regulares .
const regex = /\(p\.\s*([^)]+)\)/g; [ "Author Name, (p. 123). (2019). Company.", "Author Name, (p. 321). (2021). Company." ].forEach(s => { Array.from(s.matchAll(regex), m => console.log(m[1])) });Capturaría dígitos (¿necesita (ps) ?), No distingue entre mayúsculas y minúsculas (¿qué pasa con (P.12) ?):
/\(p\.\s*(\d+)\)/igCódigo
const regex = /\(p\.\s*(\d+)\)/gi const string = "Author Name, (p. 123). (2019). Company." console.log(string.match(regex).map(x => x.replace(/\D+/g, '')))EXPLICACIÓN
NODE EXPLANATION -------------------------------------------------------------------------------- \( '(' -------------------------------------------------------------------------------- p 'p' -------------------------------------------------------------------------------- \. '.' -------------------------------------------------------------------------------- \s* whitespace (\n, \r, \t, \f, and " ") (0 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- ( group and capture to \1: -------------------------------------------------------------------------------- \d+ digits (0-9) (1 or more times (matching the most amount possible)) -------------------------------------------------------------------------------- ) end of \1 -------------------------------------------------------------------------------- \) ')'