Expresión regular para obtener una subcadena de una coincidencia

Perdón por la redacción extraña, no estoy seguro de cómo describir lo que necesito hacer de manera sucinta...

Necesito extraer la primera parte de un número de pieza de una cadena devuelta de la base de datos de nuestro sistema. Los números de parte tienen generalmente el siguiente formato:

VENDOR FIRST123-SECOND123

VENDOR es opcional, al igual que el guión de separación. necesito terminar con FIRST123, o la última "palabra" completa si no hay guión.

Hasta ahora puedo conseguir el FIRST123-SECOND123 con lo siguiente:

[^ ]*$

No he podido descifrar cómo dividir la coincidencia resultante para obtener todo antes de cualquier carácter de guión. ¿Ideas?

preguntado el 27 de julio de 12 a las 18:07

Apuesto a que podría haber un intercambio de pila dedicado únicamente a las expresiones regulares. -

Pista: reestructura tu base de datos ;-) -

Este es un campo de entrada de texto de forma libre para ingresar una descripción de la pieza. ¡Buena suerte reestructurando eso! :) -

3 Respuestas

Podrías usar mirar hacia el futuro:

/[^-\s]+(?=\S*$)/

Esto captura la primera secuencia de caracteres que no son guiones ni espacios en blanco y que está separada del final solo por espacios que no son espacios en blanco.

Sin embargo, diría que los métodos de cadena serían de mucha más ayuda. Consigue el lastIndexOf(" "), y a partir de ahí el firstIndexOf("-"), y luego obtenga la subcadena entre estos.

Respondido 27 Jul 12, 18:07

Esto no funciona... Sin embargo, después de mirar algunas de las posibles entradas (vea mi comentario de "texto de forma libre" arriba), creo que estoy mucho mejor usando la función de cadena. Te daré la respuesta a esa sugerencia :) - davidn59

Hm, funciona (con su ejemplo de entrada). ¿Qué idioma usas, qué opciones de coincidencia configuraste? - Bergi

Uso Expresso para compilar/probar mis expresiones regulares, con parámetros predeterminados. Si dejo los caracteres de barra diagonal inicial y final, no obtengo ninguna coincidencia. Si los elimino, obtengo FIRST123 y SECOND123 como coincidencias. - davidn59

Sí, las barras son solo delimitadores comunes de expresiones regulares, según el idioma que elija, necesitará otros caracteres (o escribir la expresión regular en una cadena literal). Para obtener solo un resultado, use un método "matchFirst" o similar, y/o suelte el indicador "global". - Bergi

Gracias, eso tiene sentido. Trabajé mucho con expresiones regulares hace unos años, pero ahora ya no las uso con la frecuencia suficiente para hablar con fluidez... - davidn59

Aquí está mi expresión regular para obtener lo que quieres:

[^ ]*\w*(?=-)

Empezaste bien. \w* dice "obtener todos los caracteres de las palabras" (letras y números) y (?=-) dice "hasta uno seguido de un guión"

Respondido 27 Jul 12, 18:07

¿Qué es [^ ]* ¿bueno para? temo, junto con \w* esto podría incluso conducir a un retroceso catastrófico si no se encuentra ningún guión. - Bergi

El [^ ]* es para omitir cualquier palabra inicial delimitada por espacios. Esto tampoco funciona para mí, no porque la expresión regular no funcione, sino debido a la naturaleza no estructurada de mi texto fuente. ¡Gracias por la sugerencia! - davidn59

También podría lanzar mi sugerencia allí. Afirma que no hay más texto después del segundo número de parte.

/[a-zA-z]\+\d\+[^$]

Respondido 27 Jul 12, 18:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.