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
eipsum
, estarán en el resultado. Puede solucionar esto ejecutandoreplace(//s+/," ")
en los resultados. - Si no hay cierre
"
después deipsum
(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