¿Cómo puedo extraer texto después de los primeros dos puntos en una cadena con dos de ellos? [cerrado]
Frecuentes
Visto 1,806 equipos
8 Respuestas
3
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
2
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
2
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
1
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
0
'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
0
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
0
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
-1
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 ruby regex or haz tu propia pregunta.
Liendre:
:
es dos puntos, un punto y coma es;
. - Thomas¿Qué parte(s) es(n) la(s) cuerda(s)? - sawa
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? - sawa
Esta pregunta no muestra ningún esfuerzo - madhead