En mi código, dividí una cadena basada en _
y tomé el segundo elemento de la matriz.
var element = $(this).attr('class');
var field = element.split('_')[1];
good_luck
Me toma y me proporciona luck
. ¡Funciona genial!
Pero, ahora tengo una clase que se parece good_luck_buddy
. ¿Cómo consigo mi javascript para ignorar el segundo _
y darme luck_buddy
?
Encontré esto var field = element.split(new char [] {'_'}, 2);
en una respuesta ac # stackoverflow pero no funciona. Lo intenté en jsFiddle ...
fuente
_
coincide con un grupo de captura y se agrega a la lista de tokens por ese motivo."Aspect Ratio: 16:9".split(/:(.+)/)
out:["Aspect Ratio", " 16:9", ""]
": 16:9"
, no hay nada después del separador, creando así la cadena vacía al final.¿Para qué necesita expresiones regulares y matrices?
fuente
_
escribiendo:myString.substring( myString.indexOf('_', myString().indexOf('_') + 1) + 1 )
var str = "good_luck_buddy", res = str.split(/_(.+)/);
usted obtendrá todas las partes:console.log(res[0]); console.log(res[1]);
[ string.substring(0, string.indexOf(options.divider)), string.substring(string.indexOf(options.divider) + 1) ]
Ahí lo tienes. También con soporte de aguja variableEvito RegExp a toda costa. Aquí hay otra cosa que puedes hacer:
fuente
Reemplace la primera instancia con un marcador de posición único y luego divídalo desde allí.
Esto es más útil cuando se necesitan ambos lados de la división.
fuente
Puede usar la expresión regular como:
Puede usar el segundo parámetro que especifica el límite de la división. es decir: campo var = element.split ('_', 1) [1];fuente
'good_luck_buddy'.split('_', 1);
regresa solo['good']
(:?.*)
suponía que era un grupo que no capturaba? Si es así, debería serlo(?:.*)
, pero si lo corrige, encontrará que ya no funciona.(:?.*)
coincide con un opcional:
seguido de cero o más de cualquier carácter. Esta solución termina funcionando por la misma razón que lo hace @ MarkF: todo después de que el primero_
se agrega a la lista de tokens porque coincide en un grupo de captura. (Además, elg
modificador no tiene efecto cuando se usa en una expresión regular dividida.)Esta solución me funcionó
O
fuente
Actualmente
String.prototype.split
, de hecho, le permite limitar el número de divisiones.consideración
Es posible que no funcione de la manera que espera. Esperaba que simplemente ignorara el resto de los delimitadores, pero en cambio, cuando alcanza el límite, divide la cadena restante nuevamente, omitiendo la parte después de la división de los resultados de retorno.
Esperaba:
fuente
String.split
Desafortunadamente , Javascript no tiene forma de limitar el número real de divisiones. Tiene un segundo argumento que especifica cuántos de los elementos divididos reales se devuelven, lo que no es útil en su caso. La solución sería dividir la cadena, quitar el primer elemento y luego volver a unir los elementos restantes ::fuente
Necesito las dos partes de la cadena, por lo tanto, regex lookbehind me ayuda con esto.
fuente
Con la ayuda de la asignación de desestructuración puede ser más legible:
fuente
¿La solución más rápida?
Ejecuté algunos puntos de referencia , y esta solución ganó enormemente: 1
Comparación de rendimiento con otras soluciones.
El único competidor cercano era la misma línea de código, excepto el uso en
substr
lugar deslice
.Otras soluciones que probé involucrando
split
oRegExp
s tuvieron un gran éxito de rendimiento y fueron aproximadamente 2 órdenes de magnitud más lentas. Usarjoin
los resultados desplit
, por supuesto, agrega una penalización de rendimiento adicional.¿Por qué son más lentos? Cada vez que se debe crear un nuevo objeto o matriz, JS tiene que solicitar una porción de memoria del sistema operativo. Este proceso es muy lento.
Aquí hay algunas pautas generales, en caso de que esté persiguiendo puntos de referencia:
{}
o matrices[]
(como la quesplit
crea) costarán mucho en rendimiento.RegExp
Las búsquedas son más complicadas y, por lo tanto, más lentas que las búsquedas de cadenas.Eliminar más allá de la primera instancia
Aquí hay una solución que se dividirá e incluirá la enésima instancia. No es tan rápido, pero en la pregunta del OP,
gobble(element, '_', 1)
todavía es> 2 veces más rápido que unaRegExp
osplit
solución y puede hacer más:Con la definición anterior,
gobble('path/to/file.txt', '/')
daría el nombre del archivo ygobble('prefix_category_item', '_', 1)
eliminaría el prefijo como la primera solución en esta respuesta.fuente
La solución de Mark F es increíble, pero no es compatible con los navegadores antiguos. La solución de Kennebec es increíble y es compatible con los navegadores antiguos, pero no admite expresiones regulares.
Entonces, si está buscando una solución que divida su cadena solo una vez, que sea compatible con navegadores antiguos y que sea compatible con regex, esta es mi solución:
fuente
Para principiantes como yo que no estamos acostumbrados a la expresión regular, esta solución alternativa funcionó:
El método slice () extrae una parte de una cadena y devuelve una nueva cadena y el método indexOf () devuelve la posición de la primera aparición encontrada de un valor especificado en una cadena.
fuente
Use el
replace()
método de cadena con una expresión regular :Esta expresión regular coincide con 0 o más caracteres antes del primero
_
, y el_
propio. La coincidencia se reemplaza por una cadena vacía.fuente
document.body.innerHTML
parte aquí es completamente inútil.document.body.innerHTML
?document.body
depende del DOM para estar presente y no funcionará en un entorno de JavaScript puro.console.log
es suficiente para este propósito o simplemente deja el resultado en una variable para inspección.Esto funcionó para mí en Chrome + FF:
Si también necesita la clave, intente esto:
fuente
Aquí hay un RegExp que hace el truco.
Primero obliga al partido a comenzar desde el principio con el '^'. Luego, coincide con cualquier número de caracteres que no son '_', en otras palabras, todos los caracteres anteriores al primer '_'.
Los '?' significa un número mínimo de caracteres que hacen que todo el patrón coincida con el '. *?' porque es seguido por '_', que luego se incluye en la coincidencia como su último carácter.
Por lo tanto, esta división () usa una parte coincidente como su 'divisor' y la elimina de los resultados. Por lo tanto, elimina todo hasta el primer '_' e incluye el resto como el segundo elemento del resultado. El primer elemento es "" que representa la parte anterior a la parte coincidente. Es "" porque el partido comienza desde el principio.
Hay otros RegExps que funcionan tan bien como /_(.*)/ dado por Chandu en una respuesta anterior.
El /^.*?_/ tiene el beneficio de que puede comprender lo que hace sin tener que saber sobre el papel especial que juegan los grupos de captura con replace ().
fuente