Tengo una cadena de datos que tiene saltos de línea en el medio. Por ejemplo:
"Product Name \n Product Color \n Product Quantity \n Product Location \n Product Size \n Product Power"La cantidad de elementos en la cadena podría ser infinita.
Necesito reemplazar \n con >>>> \n pero solo cuando los números de línea son mayores que 3 y no la última línea. En la última línea necesito que diga (end)
Probé el mapa y puedo dividir y reemplazar, pero tengo problemas para iterar a través de la matriz para identificar las líneas que se van a modificar. Además de volver a unirlos una vez que todas las líneas se modifican o no.
La entrada es:
"Retract-A-Banner\n**Template:\nFull Color\nImprint Information:\nCL: 488 Special Ops Wing\n353 SOW Integrated Resilience Optimization Network\n"Rendimiento esperado:
"Retract-A-Banner\n**Template:\nFull Color >>>> \nImprint Information: >>>> \nCL: 488 Special Ops Wing >>>> \n353 SOW Integrated Resilience Optimization Network(end)\n"Divida por \n y vuelva a crear su cadena con las condiciones:
(end)>>>> \n\n estará bienEDITAR:
agregue una verificación si la última cadena es \n y elimine ese valor de la matriz.
const str = "Retract-A-Banner\n**Template:\nFull Color\nImprint Information:\nCL: 488 Special Ops Wing\n353 SOW Integrated Resilience Optimization Network\n"; const splitted = str.split('\n'); let output = ''; if (splitted[splitted.length - 1] === '') splitted.length--; for (let i = 0; i < splitted.length; i++) { if (i + 1 === splitted.length) { output += splitted[i] + ' (end)'; } else if (i >= 2) { output += splitted[i] + ' >>>> \n'; } else { output += splitted[i] + '\n'; } } console.log(output);Parece que quieres algo como esto:
var strings = `Retract-A-Banner\nTemplate:\nFull Color\nImprint Information:\nCL: 488 Special Ops Wing\n353 SOW Integrated Resilience Optimization Network\n`.split("\n"); strings.forEach((string,index) => { if (index > 2) { strings[index] = `>>>>\\n${string}` } else { index > 0 ? `\\n${string}` : strings[index]; } }) var finalString = strings.join("")+"(end)"; console.log(finalString); Tenga en cuenta que estoy escapando de su \n en ese código con una barra invertida adicional. Sin embargo, no puedo decir si eso es lo que quieres.
Qué tal algo como esto:
var data = "Retract-A-Banner\n**Template:\nFull Color\nImprint Information:\nCL: 488 Special Ops Wing\n353 SOW Integrated Resilience Optimization Network\n"; function convertToLines(entry) { return entry.split("\n").filter((val) => val); } function constructOutput(lines) { const numLines = lines.length; return lines.reduce((result, entry, index) => { var separator = index > 2 ? " >>>> \n" : "\n"; if (index == numLines - 1) { separator = "(end)\n"; } return result + entry + separator; }, ""); } console.log(constructOutput(convertToLines(data))); convertToLines usa el filter para volcar las entradas vacías que obtiene de la nueva línea al final de la cadena. Y luego tenemos que agregar eso al separador (end) .
Para insertar >>>> puedes usar la expresión regular: (?<=(.+\n.+){2,})(?=\n.)
(?<=(.+\n.+){2,}) crea una mirada positiva hacia atrás para tres líneas(?=\n.) crea una anticipación positiva para una nueva línea seguida de cualquier carácter Y luego puede usar la expresión regular similar (?<=.)(?=\n*$) para agregar '(end)' a la última línea.
const input = "Retract-A-Banner\n**Template:\nFull Color\nImprint Information:\nCL: 488 Special Ops Wing\n353 SOW Integrated Resilience Optimization Network\n"; const output = input .replace(/(?<=(.+\n.+){2,})(?=\n.)/g, ' >>>> ') .replace(/(?<=.)(?=\n*$)/, '(end)'); console.log(input); console.log(output); Si está utilizando una barra invertida literal seguida de una 'n' en su cadena, tendría el formato \\\n en su literal de cadena JS.
En ese caso, puede usar la expresión regular (?<=(.+\\n.+){2,})(?=\\n.) para insertar >>>> y la expresión regular (?=\\n$) para el (end) .
const input = "Retract-A-Banner\\n**Template:\\nFull Color\\nImprint Information:\\nCL: 488 Special Ops Wing\\n353 SOW Integrated Resilience Optimization Network\\n"; const output = input .replace(/(?<=(.+\\n.+){2,})(?=\\n.)/g, ' >>>> ') .replace(/(?=\\n$)/, '(end)'); console.log(input); console.log(output);Convertir cadena en una matriz de cadenas
string.split(/\n/) Luego use .flatMap() y un ternario encadenado como devolución de llamada. Cada condición se basa en el índice
idx < 3 ? [str+' \n'] : idx === arr.length -1 ? [str+' (end)'] : [str+' >>>> \n'] Luego .join('') la matriz de nuevo en una cadena
let test = `Retract-A-Banner\nTemplate:\nFull Color\nImprint Information:\nCL: 488 Special Ops Wing\n353 SOW Integrated Resilience Optimization Network\n" Expected Output:"Retract-A-Banner\nTemplate:\nFull Color \nImprint Information: \nCL: 488 Special Ops Wing \n353 SOW Integrated Resilience Optimization Network`; const formatLines = string => string.split(/\n/).flatMap((str, idx, arr) => idx < 3 ? [str + ' \n '] : idx === arr.length - 1 ? [str + ' (end) '] : [str + ' >>>> \n ']).join(''); console.log(formatLines(test));