¿Cómo puedo extraer texto después de los primeros dos puntos en una cadena con dos de ellos? [cerrado]

Tengo una cuerda como Test Data: Before the Data : "The War". Necesito extraer la cadena después de los primeros dos puntos. Entonces la salida debería ser:

Antes de los datos: "La guerra"

preguntado Oct 07 '14, 14:10

Liendre: : es dos puntos, un punto y coma es ;. -

¿Qué parte(s) es(n) la(s) cuerda(s)? -

Especificar demasiado algo no le daría el mejor resultado. Esto se conoce como problema X/Y. ¿Estás seguro de que necesitas usar una expresión regular para hacer eso? -

Esta pregunta no muestra ningún esfuerzo -

8 Respuestas

Coincidencia de expresiones regulares con el operador Keep

Puedes usar:

/:\s*\K.*/

\K Definido

El \K operador no está bien documentado en Ruby, pero puede encontrarlo explicado en Perlre.

Hay una forma especial de esta construcción, llamada \K , que hace que el motor de expresiones regulares "conserve" todo lo que coincidía antes de \K y no lo incluya en $& . Esto proporciona efectivamente una mirada retrospectiva de longitud variable. ...Por varias razones, \K puede ser significativamente más eficiente que la construcción equivalente (?<=...), y es especialmente útil en situaciones en las que desea eliminar de manera eficiente algo que sigue a otra cosa en una cadena.

Ejemplo practico

Considere lo siguiente:

string = %q{Test Data: Before the Data : "The War"}.match(/:\s*\K.*/).to_s
#=> "Before the Data : \"The War\""

Esto hará coincidir los primeros dos puntos seguidos de espacios en blanco opcionales, descartará la coincidencia hasta ese punto y luego capturará el resto de la cadena como Datos de coincidencia. Invocando #a_s en el objeto MatchData devuelve la coincidencia como un Cordón para asignación o salida.

Respondido 07 Oct 14, 15:10

a = 'Test Data: Before the Data : "The War"'
p a[/: (.+)/, 1] #=> "Before the Data : \"The War\""

No entiendo por qué algunas de las soluciones son tan complicadas aquí, la expresión regular debería ser bastante simple: primero encuentre los primeros dos puntos y luego capture todo lo que sigue.

Respondido 07 Oct 14, 14:10

En cuanto a por qué está etiquetado como expresión regular, no son necesarios para el problema de OP en absoluto, solo suena como una pregunta restrictiva sobre un problema más amplio, por lo que dar pistas sobre expresiones regulares ya que el OP parece estar interesado en ellas lleva a complicarlas demasiado. - Tensibai

Usar métodos de cadena

Como ejemplo, el Cadena#partición El método le permitirá especificar un patrón como una cadena o una expresión regular. Dado que esencialmente solo desea descartar la primera mitad de una cadena usando los dos puntos como delimitador, esto funcionará:

string = %q{Test Data: Before the Data : "The War"}.partition(': ').pop
#=> "Before the Data : \"The War\""

Los métodos de cadena no son inherentemente mejores o peores que expresión regular or Datos de coincidencia métodos, pero con frecuencia son más rápidos en el caso general. Más importante aún, #partition es una forma diferente de ver el problema y le brinda un conjunto diferente de métodos para manipular los resultados.

Respondido 07 Oct 14, 14:10

Hice un punto de referencia de todas las respuestas aquí por diversión y la tuya fue la más rápida: D - daremkd

con cuerda [] operador:

'Test Data: Before the Data : "The War"'[/[^:]*:(.*)/,1]
# => " Before the Data : \"The War\""

Doc es aquí.

La expresión regular captura todo después de los primeros dos puntos. Para mayor seguridad, utilicé una clase negativa que coincidía con cualquier cosa menos dos puntos. [^:] antes del colón.

Respondido 07 Oct 14, 14:10

@sawa, ¿por qué suprimir el mensaje irb que muestra que es una salida del mundo real y no una supuesta salida? - Tensibai

Solo debe escribir la salida real después de #=>. No escriba una supuesta salida en primer lugar. Irb indica que es más difícil de leer. Y lo que es más importante, el código está diseñado principalmente para ejecutarse cuando se escribe en un archivo. Puede usar irb para verificar, pero eso debe hacerse en el backstage. - sawa

@Sawa ??? No entiendo el punto, prefiero las respuestas con una 'captura de pantalla' del mundo real que una versión modificada. Además, estoy bastante acostumbrado a hacer enlaces AQUÍ al documento en mayúsculas para llamar la atención del lector, en minúsculas la mayoría de la gente los extraña, especialmente aquí con los colores de bajo contraste elegidos... - Tensibai

Poner las palabras en mayúsculas sobresale demasiado y es feo. Hay suficiente diferencia de color para decir que es un enlace. - sawa

@Sewa Probablemente no sea daltónico, el azul claro sobre blanco está cerca del negro, enfatizarlo con letras mayúsculas ayuda a comprender que es un enlace y es una forma habitual de señalar documentos cuando el enlace está en una palabra corta. - Tensibai

'Test Data: Before the Data : "The War"'
.split(": ", 2).last
#=> "Before the Data : \"The War\""

Respondido 07 Oct 14, 14:10

FWIW, voté como la mejor solución en este contexto, respondí solo con expresiones regulares por etiquetas OP. - Tensibai

@Tensibai Está bien. Lo siento. Y gracias. - sawa

De nada, pero sigo encontrando tu edición de respuestas bastante grosera y muy opinada, especialmente sin siquiera explicarlo en el comentario de edición... pero no importa. - Tensibai

La motivación principal de mi edición fue que su respuesta incluía errores gramaticales obvios. - sawa

Bueno, como el inglés no es mi lengua materna, no discutiré mucho al respecto;) la coma fue intencional pero podría ser mala, está bien. - Tensibai

Simplemente elimine todas las cadenas antes de la primera :

'Test Data: Before the Data : "The War" '.sub(/^[^:]*:/, "")
# => " Before the Data : \"The War\" "

Prueba esto si no quieres los espacios iniciales.

'Test Data: Before the Data : "The War" '.sub(/^[^:]*:\s*/, "")
# => "Before the Data : \"The War\" "

Respondido 07 Oct 14, 14:10

Prueba esto:

a = 'Test Data: Before the Data : "The War"'.split(':',2)
print a[1..a.length]
#=> Before the Data : "The War"

String#split toma un segundo argumento, el límite.

Respondido 07 Oct 14, 14:10

Es broma (la solución no se basa en absoluto en expresiones regulares):

s='Test Data: Before the Data : "The War"'

s.split(':')[1..-1].join(':').strip
# => "Before the Data : \"The War\""

Respondido 07 Oct 14, 14:10

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