una texto palabra pagina manejo frase eliminar dentro cortar caracteres caracter cadenas cadena buscar javascript regex parsing

texto - eliminar caracteres de una cadena javascript



cadenas de análisis: extracción de palabras y frases (10)

Necesito apoyar frases exactas (entre comillas) en una lista de términos separada por el espacio. Por lo tanto, dividir la cadena respectiva por el espacio-carácter ya no es suficiente.

Ejemplo:

input : ''foo bar "lorem ipsum" baz'' output: [''foo'', ''bar'', ''lorem ipsum'', ''baz'']

Me pregunto si esto podría lograrse con un solo RegEx, en lugar de realizar operaciones complejas de análisis y división y reincorporación.

¡Cualquier ayuda sería muy apreciada!


Esta podría ser una respuesta muy tardía, pero estoy interesado en responder

([/w]+|/"[/w/s]+/")

http://regex101.com/r/dZ1vT6/72

Ejemplo de javascript puro

''The rain in "SPAIN stays" mainly in the plain''.match(/[/w]+|/"[/w/s]+/"/g)

Productos:

["The", "rain", "in", ""SPAIN stays"", "mainly", "in", "the", "plain"]


Muchas gracias por las respuestas rápidas!

Aquí hay un resumen de las opciones para la posteridad:

var input = ''foo bar "lorem ipsum" baz''; output = input.match(/("[^"]+"|[^"/s]+)/g); output = input.match(/"[^"]*"|/w+/g); output = input.match(/("[^"]*")|([^/s"]+)/g) output = /(".+?"|/w+)/g.exec(input); output = /"(.+?)"|(/w+)/g.exec(input);

Para el registro, aquí está la abominación que se me ocurrió:

var input = ''foo bar "lorem ipsum" "dolor sit amet" baz''; var terms = input.split(" "); var items = []; var buffer = []; for(var i = 0; i < terms.length; i++) { if(terms[i].indexOf(''"'') != -1) { // outer phrase fragment -- N.B.: assumes quote is either first or last character if(buffer.length === 0) { // beginning of phrase //console.log("start:", terms[i]); buffer.push(terms[i].substr(1)); } else { // end of phrase //console.log("end:", terms[i]); buffer.push(terms[i].substr(0, terms[i].length - 1)); items.push(buffer.join(" ")); buffer = []; } } else if(buffer.length != 0) { // inner phrase fragment //console.log("cont''d:", terms[i]); buffer.push(terms[i]); } else { // individual term //console.log("standalone:", terms[i]); items.push(terms[i]); } //console.log(items, "/n", buffer); } items = items.concat(buffer); //console.log(items);


Prueba esto:

var input = ''foo bar "lorem ipsum" baz''; var R = /(/w|/s)*/w(?=")|/w+/g; var output = input.match(R); output is ["foo", "bar", "lorem ipsum", "baz"]

Tenga en cuenta que no hay comillas dobles adicionales alrededor de lorem ipsum

Aunque asume que la entrada tiene las comillas dobles en el lugar correcto:

var input2 = ''foo bar lorem ipsum" baz''; var output2 = input2.match(R); var input3 = ''foo bar "lorem ipsum baz''; var output3 = input3.match(R); output2 is ["foo bar lorem ipsum", "baz"] output3 is ["foo", "bar", "lorem", "ipsum", "baz"]

Y no manejará las comillas dobles escapadas (¿es eso un problema?):

var input4 = ''foo b/"ar bar/" /"bar "lorem ipsum" baz''; var output4 = input4.match(R); output4 is ["foo b", "ar bar", "bar", "lorem ipsum", "baz"]


Si solo se pregunta cómo construir la expresión regular usted mismo, es posible que desee comprobar Expresso ( enlace Expresso ). Es una gran herramienta para aprender a construir expresiones regulares para que sepa lo que significa la sintaxis.

Cuando haya creado su propia expresión, podrá realizar una .match en ella.


Soporte de la solución ES6:

  • Dividido por el espacio a excepción de las comillas internas
  • Quitando comillas, pero no para las comillas saltadas de la barra invertida
  • Cita escapada se convierte en cita

Código:

input.match(///?.|^$/g).reduce((p, c) => { if(c === ''"''){ p.quote ^= 1; }else if(!p.quote && c === '' ''){ p.a.push(''''); }else{ p.a[p.a.length-1] += c.replace(///(.)/,"$1"); } return p; }, {a: ['''']}).a

Salida:

[ ''foo'', ''bar'', ''lorem ipsum'', ''baz'' ]


Una expresión regular simple servirá, pero dejará las comillas. p.ej

''foo bar "lorem ipsum" baz''.match(/("[^"]*")|([^/s"]+)/g) output: [''foo'', ''bar'', ''"lorem ipsum"'', ''baz'']

editar: golpeado por shyamsundar, perdón por la doble respuesta


Uno que sea fácil de entender y una solución general. Funciona para todos los delimitadores y caracteres ''join''. También admite palabras ''unidas'' que tienen más de dos palabras de longitud ... es decir listas como

"hello my name is ''jon delaware smith fred'' I have a ''long name''" ....

Un poco como la respuesta de AC pero un poco más ordenada ...

function split(input, delimiter, joiner){ var output = []; var joint = []; input.split(delimiter).forEach(function(element){ if (joint.length > 0 && element.indexOf(joiner) === element.length - 1) { output.push(joint.join(delimiter) + delimiter + element); joint = []; } if (joint.length > 0 || element.indexOf(joiner) === 0) { joint.push(element); } if (joint.length === 0 && element.indexOf(joiner) !== element.length - 1) { output.push(element); joint = []; } }); return output; }


qué tal si,

output = /(".+?"|/w+)/g.exec(input)

luego haz un pase en la salida para perder las comillas.

alternativamente,

output = /"(.+?)"|(/w+)/g.exec(input)

luego haga una pasada n salida para perder las capturas vacías.


var str = ''foo bar "lorem ipsum" baz''; var results = str.match(/("[^"]+"|[^"/s]+)/g);

... devuelve la matriz que estás buscando.
Tenga en cuenta, sin embargo:

  • Las citas delimitadoras están incluidas, por lo que se pueden eliminar con replace(/^"([^"]+)"$/,"$1") en los resultados.
  • Los espacios entre las comillas permanecerán intactos. Entonces, si hay tres espacios entre lorem e ipsum , estarán en el resultado. Puede solucionar esto ejecutando replace(//s+/," ") en los resultados.
  • Si no hay cierre " después de ipsum (es decir, una frase citada incorrectamente), terminará con: [''foo'', ''bar'', ''lorem'', ''ipsum'', ''baz'']

''foo bar "lorem ipsum" baz''.match(/"[^"]*"|/w+/g);

las citas de límite se incluyen, aunque