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_luckMe 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, elgmodificador 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.splitDesafortunadamente , 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
substrlugar deslice.Otras soluciones que probé involucrando
splitoRegExps tuvieron un gran éxito de rendimiento y fueron aproximadamente 2 órdenes de magnitud más lentas. Usarjoinlos 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 quesplitcrea) costarán mucho en rendimiento.RegExpLas 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 unaRegExposplitsolució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.innerHTMLparte aquí es completamente inútil.document.body.innerHTML?document.bodydepende del DOM para estar presente y no funcionará en un entorno de JavaScript puro.console.loges 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