Tengo este codigo:
var r = /(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*){0,}$/
var s = "   a   ,  b  , c "
var m = s.match(r)
m => ["   a   ,  b  , c ", "a", "c"]
Parece que toda la cadena ha coincidido, pero ¿a dónde se ha "b"ido? Preferiría esperar obtener:
["   a   ,  b  , c ", "a", "b", "c"]
para que pueda hacer m.shift()con un resultado como s.split(',')pero también con los espacios en blanco eliminados.
¿Tengo un error en la expresión regular o no lo entiendo String.prototype.match?
                    
                        javascript
                                regex
                                
                    
                    
                        meandre
fuente
                
                fuente

{0,}es lo mismo que*.stambién puede ser' a, c'o'a,b,c d e, f'Respuestas:
Aquí hay una forma bastante simple y directa de hacer esto sin necesidad de una expresión regular compleja.
var str = " a , b , c " var arr = str.split(",").map(function(item) { return item.trim(); }); //arr = ["a", "b", "c"]El nativo
.mapes compatible con IE9 y versiones posteriores: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapO en ES6 + se vuelve aún más corto:
var arr = str.split(",").map(item => item.trim());Y para completar, aquí está en TypeScript con información de escritura.
var arr: string[] = str.split(",").map((item: string) => item.trim());fuente
var arr = str.split(",").map(item=>item.trim());Puede probar esto sin expresiones regulares complejas.
var arr = " a , b , c ".trim().split(/\s*,\s*/); console.log(arr);fuente
Respuesta corta: use
m = s.match(/[^ ,]/g);Su RE no funciona como se esperaba, porque el último grupo coincide con la coincidencia más reciente (=
c). Si omite{1,}$, la coincidencia devuelta será" a , b ", "a", "b". En resumen, su RegExp devuelve tantas coincidencias como grupos especificados a menos que use unaglobalbandera/g. En este caso, la lista devuelta contiene referencias a todas las subcadenas coincidentes.Para lograr su efecto, use:
m = s.replace(/\s*(,|^|$)\s*/g, "$1");Este reemplazo reemplaza cada coma (
,), comienzo (^) y final ($), rodeado por espacios en blanco, por el carácter original (comma, o nada).Si desea obtener una matriz, use:
m = s.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/);Este RE recorta la cadena (elimina todos los espacios en blanco al principio y al final, luego divide la cadena por
<any whitespace>,<any whitespace>. Tenga en cuenta que los caracteres de espacio en blanco también incluyen nuevas líneas y tabulaciones. Si desea ceñirse solo a los espacios, use un espacio () en lugar de\s.fuente
splitmétodo.s.match(/[^ ,]+/g). Como se mencionó en la parte superior de mi respuesta,/ges la bandera global, que devuelve todas las subcadenas coincidentes.a,byc, se necesitan tres pares de paréntesis (sin incluir(?:...)):/(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)$/ES6 taquigrafía:
str.split(',').map(item=>item.trim())fuente
Puede hacer esto para su propósito
EDITAR : Eliminar el segundo reemplazo como se sugiere en los comentarios.
s.replace(/^\s*|\s*$/g,'').split(/\s*,\s*/)Primero
replacerecorta la cadena y luego lasplitfunción se divide'\s*,\s*'. Esto da salida["a", "b", "c"]a la entrada" a , b , c "En cuanto a por qué su expresión regular no captura 'b', está repitiendo un grupo capturado, por lo que solo se captura la última aparición. Más sobre eso aquí http://www.regular-expressions.info/captureall.html
fuente
así que finalmente fui con
/(?=\S)[^,]+?(?=\s*(,|$))/g, que proporciona exactamente lo que necesito: todas las oraciones divididas por ',' sin espacios circundantes.' a, OMG abc b a b, d o WTF foo '. match( /(?=\S)[^,]+?(?=\s*(,|$))/g ) => ["a", "OMG abc b a b", "d o WTF foo"]¡muchas gracias!
fuente
(?=\S)- comience a capturar solo cuando no haya espacios en blanco al frente[^,]+- capture la mayor cantidad posible de "no comas"?- pero no capture lo que pueda ser capturado por el siguiente grupo(?=\s*(,|$))- capture todos los espacios en blanco antes una coma o el final de la cadena/g- repita en toda la cadenaSi desea seguir usando expresiones regulares, mantenga el código simple y sin usar ES6:
s.replace(/ /g, '').split(",")1 - Reemplaza todos los espacios (/ / g) por cadenas vacías ('')
2 - Luego divídelo en una matriz
Et voila
fuente