¿Cómo funcionan los Anchor \ z y \ G en Ruby?

Estoy usando Ruby1.9.3. Soy novato en esta plataforma.

Desde el documento acabo de familiarizarme con dos anchor que son \z y \G Ahora jugué un poco con \z para ver cómo funciona, ya que la definición ( Fin o Fin de cadena ) me confundió, no puedo entender lo que significa decir – por End . Así que probé los pequeños fragmentos de abajo. Pero todavía no puede atrapar.

CÓDIGO

 irb(main):011:0> str = "Hit him on the head me 2\n" + "Hit him on the head wit> => "Hit him on the head me 2\nHit him on the head with a 24\n" irb(main):012:0> str =~ /\d\z/ => nil irb(main):013:0> str = "Hit him on the head me 24 2\n" + "Hit him on the head > => "Hit him on the head me 24 2\nHit him on the head with a 24\n" irb(main):014:0> str =~ /\d\z/ => nil irb(main):018:0> str = "Hit1 him on the head me 24 2\n" + "Hit him on the head> => "Hit1 him on the head me 24 2\nHit him on the head with a11 11 24\n" irb(main):019:0> str =~ /\d\z/ => nil irb(main):020:0> 

Cada vez tengo nil como salida. Entonces, ¿cómo va el cálculo para \z ? ¿Qué significa el End ? – Creo que mi concepto tomó algo mal con la palabra End en el documento. Entonces, ¿alguien podría ayudarme a entender la razón por la que sucede?

Y tampoco encontré ningún ejemplo para el ancla \G ¿Algún ejemplo, por favor de ustedes, para visualizar cómo se usa \G en la progtwigción en tiempo real?

EDITAR

 irb(main):029:0> irb(main):030:0* ("{123}{45}{6789}").scan(/\G(?!^)\{\d+\}/) => [] irb(main):031:0> ('{123}{45}{6789}').scan(/\G(?!^)\{\d+\}/) => [] irb(main):032:0> 

Gracias

\z coincide con el final de la entrada. Está intentando encontrar una coincidencia en la que se produzcan 4 al final de la entrada. El problema es que hay una nueva línea al final de la entrada, por lo que no encuentra una coincidencia. \Z coincide con el final de la entrada o una nueva línea al final de la entrada.

Asi que:

 /\d\z/ 

coincide con el “4” en:

 "24" 

y:

 /\d\Z/ 

coincide con el “4” en el ejemplo anterior y el “4” en:

 "24\n" 

Echa un vistazo a esta pregunta, por ejemplo, de usar \G :
Ejemplos de regex matcher \ G (el final de la coincidencia anterior) en Java serían agradables


ACTUALIZACIÓN: usos del mundo real para \G

Se me ocurrió un ejemplo del mundo más real. Supongamos que tiene una lista de palabras separadas por caracteres arbitrarios que no se pueden predecir bien (o hay muchas posibilidades de enumerar). Le gustaría hacer coincidir estas palabras donde cada palabra es su propia coincidencia hasta una palabra en particular, después de lo cual no desea que coincida con más palabras. Por ejemplo:

foo, bar.baz: buz’fuzz * hoo-har / haz | fil ^ bil! bak

Quieres hacer coincidir cada palabra hasta ‘har’. No quieres hacer coincidir ‘har’ o cualquiera de las palabras que siguen. Puedes hacerlo de forma relativamente fácil usando el siguiente patrón:

 /(?<=^|\G\W)\w+\b(? 

rubular

El primer bash coincidirá con el inicio de la entrada seguido de cero caracteres sin palabras seguidos de caracteres de 3 palabras ('foo') seguidos de un límite de palabras. Finalmente, una mirada negativa asegura que la palabra que acaba de coincidir no es "har".

En el segundo bash, las recuperaciones coincidentes se recuperan al final de la última partida. Se hace coincidir 1 carácter sin palabra (',', aunque no se captura debido a la apariencia detrás, que es una aserción de ancho cero), seguido de 3 caracteres ('barra').

Esto continúa hasta que se hace coincidir 'har', en cuyo punto se activa el aspecto negativo detrás de él y la coincidencia falla. Como se supone que todas las coincidencias deben estar "vinculadas" a la última coincidencia exitosa, no se asignarán palabras adicionales.

El resultado es:

 foo bar baz buz fuzz hoo 

Si desea revertirlo y tener todas las palabras después de 'har' (pero, nuevamente, sin incluir 'har'), puede usar una expresión como esta:

 /(?!^)(?<=har\W|\G\W)\w+\b/ 

rubular

Esto coincidirá con una palabra que está precedida inmediatamente por 'har' o el final de la última coincidencia (excepto que debemos asegurarnos de no coincidir con el comienzo de la entrada). La lista de partidos es:

 haz fil bil bak 

Si desea hacer coincidir 'har' y todas las siguientes palabras, puede usar esto:

 /\bhar\b|(?!^)(?<=\G\W)\w+\b/ 

rubular

Esto produce las siguientes coincidencias:

 har haz fil bil bak 

¿Parece que quieres saber cómo funciona Regex? ¿O quieres saber cómo funciona Regex con ruby?

Echa un vistazo a estos

Descripción de Regexp Class

The Regex Coach – Excelente para probar la coincidencia de expresiones regulares

Hoja de trucos Regex

Entiendo que \ G es un carácter de coincidencia de límites. Así que le diría al próximo partido que comience al final del último partido. Tal vez ya que aún no has hecho un partido, no puedes tener un segundo.

Aquí está el mejor ejemplo que puedo encontrar. No está en Ruby pero el concepto debe ser el mismo.

Me lo devuelvo, esto podría ser más útil.