Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

El caso de (?) como delimitador

9/29
Recursos

El ? indica al patrón que encuentre las coincidencias de manera rápida (o greedy); es decir, devolviendo el resultado más pequeño que haga match hasta donde se encuentra el delimitador, y esto lo haga tantas veces como sea posible dentro de la cadena.

Aportes 79

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

el caracter ? es un delimitador cuando esta antecedido por el +, para encontrar la minima ocurrencia posible. Si no tiene el mas, ya no es delimitador sino simbolo de ocurrencia de cero a una vez.

Usos de ?

-Para expresar que pueden o no haber cierto caracter ejemplo: \d[a-zA-z]? (Indica busqueda de un digito y despues puede haber o no una letra)

-Como delimitador, es decir; busca los grupos más pequeños posibles segun la condicion dada ejemplo: \d\d+? (Busca subgrupos de dos numeros)

Recuerden: \n es un salto de linea

El ? indica al patrón que encuentre las coincidencias de manera rápida (o greedy); es decir, devolviendo el resultado más pequeño que haga match hasta donde se encuentra el delimitador, y esto lo haga tantas veces como sea posible dentro de la cadena.
Por ejemplo, tenemos:
csv1,csv2,csv3,csv4,csv5
echo1,echo2,echo3,echo4
12,123,1234,12345,123456
si utilizo .*, Va a seleccionar cada línea y el match va a ser muy grande, hasta la última coma, pero, si utilizo .+?, los match son más pequeños, y son separados por la última coma.
Para incluir la última columna, se construye una nueva clase que incluya a la coma y a un espacio en blanco o un salto de línea, así: .+?[,\n]{1,1}.

Hola, no entendí la última parte de la expresión: {1,1}

Gracias por su ayuda.

Pueden usar esta pa’gina tambien para hacer sus experimentos:
https://regexr.com/

Excelente clase

estoesmíoestoesmíoestoesmíoestoesmíoestoesmío


¿Por qué a mi no me funciona?

👋Hola chicos, Aquí les dejo el resumen de lo que pude entender de esta clase

Generalmente cuando buscamos hacer un match en el código en un archivo (cvs, txt, etx) por medio de una expresión regular, lo podemos hacer de una manera no tan exacta.
Ejemplo: queremos encontrar todos los posibles match en este archivo.txt

Pero gracias a la expresión regular ? , podemos conocer otra ayuda que nos esta ofreciendo esta misma.

Aquí enumeramos el beneficio que ya conocemos en las anteriores clases del curso y la que nos esta explicando el profesor en esta clase.

  1. Nos buscara y seleccionara el carácter Si esta ó No esta en el código.
  1. Nos buscara y seleccionara el match de una forma mucho mas precisa, de manera de que podamos encontrar muchas mas coincidencias en una o varias lineas de código.

Dale un like en ❤ si te ayudo esta recomendación

? <- busca el mas pequeño posible

Para darse cuenta de cómo pueden la cantidad de elementos que encuentran, vean la cantidad de valores encontrados en su editor.

En el caso del profesor, al inicio detectaba una cantidad cuando buscaba con la expresión .+?. Mientras que cuando lo hace con la expresión .+?[, \n]{1,1} cambia la cantidad de encontrados.

^[0-9]{3}[-.]?[0-9]{3}[-.]?[0-9]{3}

con esta expresión podemos buscar numeros telefonicos en Peru

Para buscar números telefónicos fijos en Colombia, podemos usar la siguiente clase:

\d{3}[\-\. ]?\d{2}[\-\. ]?\d{2}

Filtrando correo electronico

^[a-z0-9]{1,20}\@\w{1,10}\.\w+[\com]$

Creo que asi seria la de email:

\w+\@\w+\.\w+\.*\w*

Para el ejemplo visto en clase podemos usar el signo ? como un limitador para encontrar las mínimas ocurrencias y también como símbolo de concurrencia, por lo que esta solución .+?,? 🔥 también hubiese servido para coincidir con los últimos caracteres que no tienen coma (,) al final, en lugar de la usada en clase .+?[,\n] 💻
.
Nota: La solución que sugiero, no toma en consideración el salto de línea. Por lo que dependiendo el caso, te puede servir una u otra. 🤠

Encontrar e-mail:

.+[@].+[\.].+

esto hice para buscar correos

[\w\+?.?]{1,}@[0-9a-zA-Z]{1,}.{1,1}\w{1,}

incluyo “.”, “+” y al final puedes ser algo mas que “.com”

Como un ejercicio hice esta REGEX para buscar correos electrónicos, seguramente hay maneras mas eficientes de hacerlo pero esta es un pequeño ejercicio para entenderlo mejor, recomiendo intentar hacer búsquedas personalizadas, ayuda bastante a entender la lógica

\[email protected][a-zA-Z]+\.com

💡 ? tiene dos funciones:

  1. Que exista o no un caracter
  2. Sirve para que del match general busque coincidencias internas (más pequeñas)

Para estructuras json

{"card":"2","numbers":{"Conway":[1,11,21,1211,111221,312211],"Fibonacci":[0,1,1,2,3,5,8,13,21,34]}}

regex
(".+?")😦(".+?")?([.+?])?({.+?})?)+?


Para buscar cada uno de los <tag></tag> o <tag/> en html

<.+?>

Esta es mi solución, funciona igual y agrega incluso a los que no tienen coma al final

\w*,?

el uso de interrogación tiene 2 usos

  • con un carácter es si aparece o no
  • con un delimitador que encuentre de la forma más corta posible.

¿Me parece a mí o el profesor divaga mucho?

Para buscar correos he usado esta expresión , se que se puede mejorar 😛
[a-zA-Z.:]{1,}\w*+?[@]\w*[.]?\w*

Les comparto mi regEX para encontrar correos con lo que hasta ahora he aprendido.

/[a-zA-Z0-9.-+]{1,}@[a-zA-Z]{1,}.[a-zA-Z]{1,}/gm

De esta forma valido el número de teléfono (España) en Java


import java.util.regex.Matcher;
import java.util.regex.Pattern;


    public static boolean validatePhone(String phoneNumber) {
        Pattern pattern = Pattern
                .compile("^(?:(?:\\+|00)?34)?[6789]\\d{8}$");

        Matcher mather = pattern.matcher(phoneNumber);
        return mather.find();
    }
  • .+?, -> Encuentra todo caracter 1 o más veces, antes de la coma, separados por cada coma.
  • .+?[,\n]{1,1} -> Con esto ya tenemos cada valor en un archivo CSV

Increíblemente Potentes, justo lo que me gusta, a la hora de Programar.

Delimitador ?:
Funciona para dos fines:
Hacer match en lo que puede o no estar.

Reducir los matches a lo más pequeño posible.
‘Es decir: Haz el match, pero los divides en grupos pequeños’.

Ejemplos:

  1. \d?\w\d
  2. .+?

Yo ya jugué y experimente mucho con esto, tanto que ya hice algunos tutoriales del curso

Se refiere a que divide el match completo en grupos pequeños de matches.

7. Mis apuntes sobre: “El caso de (?) como delimitador”
? --> modifica el +,*

  • 1. Ejemplo regex: <?> como modificador débil
.+?,

-Explicación 1: Encuentra y selecciona [match], todos los caractares que existan
antes de una coma, haz el match, pero divídelos en los grupos más pequeños posibles,
de igual manera cumpliendo las condiciones.
’
’

Este lo probé con mails

[a-zA-Z\d_-]+([\.-_][[a-zA-Z\d])*@[a-zA-Z\d]+\.[a-z]+(\.[a-z]+)?```

Codigo en java
/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */
    package strings;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
*

  • @author Sem-6-INGENIERIAINDU
    */
    public class Strings {

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) {
      String mensaje = “Hola como te encuentras sofia 22”;
      Pattern pattern = Pattern.compile("\d+?{2}");
      Matcher matcher = pattern.matcher(mensaje);
      while (matcher.find()) {
      System.out.println("Matcher: " + matcher.group());
      }

    }

}

Resultado de la ejecucion
run:
Matcher: 2
Matcher: 2
BUILD SUCCESSFUL (total time: 0 seconds)

Expresiones regulares
. Equivale a caracteres
\d Equivale solo a numeros
\w Equivale busca numeros y letras, sin tener en cuenta caracteres especiales
\s Equivale a buscar los espacios, saltos de linea
[0-9] o [A-Z] Equivale a buscar todos los digitos dentro del rango

  •          cero o mas veces
    

? cero o una sola vez

  •          una o mas veces     
    

\d{4,10} Busca el rango minimo 4 y maximo 10
\d{4,} Busca el rango minimo 4 y al infinito

El delimitador ? tiene dos funciones.

Esta seria mi manera de verificar un mail del tipo

[email protected]

[a-zA-Z0-9\.]{0,}@[a-zA-z]{0,}\.[a-z]{0,}```

La expresión regular que el profesor termino en el minuto 04:40 , creo que no es lo mas correcto, ya que esta aceptando todo un salto de linea

Dejo mi aporte de como lo solvente :

\w+,*

hasta este vídeo entiendo que las expresiones regulares sirven para buscar caracteres específicos, es decir cualquier cosa que tenga que buscar en un documento ya sean letras, palabras y números que tengan o no un significado?

estoy en lo cierto? o alguien me corrige…

Mi expresión regular para validar un correo pero quisiera saber si hay forma de hacerlo de una manera mas optima ? gracias.

[0-9a-zA-Z\.\_\-][email protected][A-Za-z]+\.[a-zA-Z]{3,3}\.?[a-zA-Z0-9]{0,2}

Alguien mas entendió para que sirve el (?), pero no lo que quiso decir el profesor ? en el minuto 5 ya se termina la clase y empieza la introducción al próximo video…

Muy interesante el doble uso que tiene el operador ?

para tomar lo que hay despues de la coma se me ocurrio hacer lo siguiente :
.*?,[\w]{1,}

Cuál sería la utilidad de este delimitador?

¡compañeros! aquí comparto este sitio para prácticar REGEx regexcrossword.com

para buscar correos

<\w+@[hotmail|gmail]+.com>

Ahora si puedo encontrar URL’s correos e IP

Muy bien.

[\w+\.?]{1,100}@\w+\.\w+```

super

Mi forma de encontrar correos.

.*@[A-Za-z]+.com

\[email protected]{1,1}(hotmail|gmail|outlook).com

Expresión regular para validar un correo

Creo que esta sería una buena expresión para encontrar cualquier tipo de correo independientemente del TLD o del proveedor de correo electrónico que use el usuario.

\w[email protected]\w+\.[a-zA-Z]{2,4}

Mi idea de filtrar correos

[\w\.][email protected]\w+\.[a-zA-Z]{2,4}

me encanta estas clases, realmente hay mucho ejercicio mental, se tiene que razonar, pero artito,

Por otro lado

pero no considero las comas, por ahí puede haber un error

Correo funciona con varios

\w{0,}\.?\w{0,}\.?\w{0,}[\.\-]?\w{0,}[\+]?[a-zA-Z0-9\.]{0,}@[a-zA-z]{0,}\.[a-z]{0,}

Va a ser de gran utilidad esta función del símbolo ? cuando vayamos a seleccionar varios grupos de datos que se encuentren en listas seguidas y los queramos en grupos pequeños. Muchas gracias por la clase instructor Alberto.

Hola, buenas tardes.

Piensoi que la descripción de la clase es incorrecta:

Dice; El ? indica al patrón que encuentre las coincidencias de manera rápida (o greedy); es decir, devolviendo el resultado más pequeño…

Pienso que debe decir; El ? indica al patrón que encuentre las coincidencias de manera rápida (o lazy); es decir, devolviendo el resultado más pequeño…

Entendiendo que hacer matches de manera greedy es tomar todo el string posible, siempre y cuando se cumpla la regexp. Y hacer matches de manera lazy es tomar el sting de la manera más rápida, siempre y cuando se cumpla la regexp.

Basicamente permite encontrar si existen matches mas pequeños dentro de un match grande que hayas encontrado

excelente ¡ genial e aprendido mucho con ustedes mil gracias

<h1>Delimitadores</h1>
  • (?)
    por ejemplo, para obtener sólamente el último caracter antes de una coma, usar .,

Como delimitador de lazy, de todo el match haz el más pequeño posible, lo más rápido que encuentre (en una linea con varias comas, por ejemplo normalmente traería todos los caracteres juntos antes de la última coma y con ? haría separaciones en cada coma)

Hice esta expresión regular como practica
\d[0-5]{1,1}?6

Delimitador Lazy ?

  • .+?,
  • Hace los maches mas pequeños

Mi RegExp para evaluar emails

[\w\-\+]{1,64}@[\w\-]{1,255}\.[A-Za-z]{2,10}\.[A-Za-z]{2,2}

NOTA: Está limitado a no escribir caracter punto en el nombre de dominio ni en el nombre de servidor, pues la RegExp se rompe en esos casos.
Con Pipe y otros operadores se puede superar, pero ha estas alturas del curso no las hemos visto todavía.
Me base en nombres de dominio bastante realistas.

  • el delimitador ? devuelve el match más pequeño posible. Se escribe al lado derecho de un contador.
    Ejemplo: Sea la expresion ‘csv1,csv2,csv3’ la regex .+?, devolverá 2 matches.

si agregamos un espacio antes de la ¨,¨ y modificamos la línea!
csv1,csv2,csv3,csv4,csv5
por
csv1,csv2,csv3 ,csv4 ,csv5
nos encuentra 2 match

La manera en como se podría hacer esto es de la siguiente manera
grep -E -no '\w+\@?\w+,'

El delimitador (?) Lazy
Busca cumplir la condición que le pides, pero de la mínima o más corta forma posible…
Yo lo asocio con que es como que si le dieras la orden de que te cumpliera una condición, y este te la cumpliera de la forma más ‘perezosa’ (Lazy) posible.
Ej.

.+?,

Significa, encuéntrame todo lo que cumpla la condición que te pido, pero no te esfuerces mucho, con que la cumpla ya está. O en este caso:
_encuéntrame todo lo que tenga 1 o más caracteres y luego una coma, pero si encuentras lo minimo que cumpla con esto, ya muestramelo como un match _

que loco estoy usando el buscador de eclipse en un archivo html que no me marca todos los resultados sino que los va buscando uno por uno y dependiendo el sentido en el que recorra el archivo los match que resalta pueden ser diferentes

// El caso de (?) como delimitador

// El ? indica al patrón que encuentre las coincidencias de manera rápida (o greedy); es decir,
// devolviendo el resultado más pequeño que haga match hasta donde se encuentra el delimitador,
// y esto lo haga tantas veces como sea posible dentro de la cadena.

var e = /.*,/; // No me sirve para separar por comas porque toma casi toda la línea como un match

var e = /.*?,/; // El muchos (* ó +) unificado con '?' me lo traduce a que me traiga el conjunto de caracter mas pequeño antes de la coma ','

// Matemáticamente se traduce así:
// *? ~ (0,inf) ∩ (0,1) = (0, máx) antes de la coma ','
// +? ~ (1,inf) ∩ (0,1) = (1, máx) antes de la coma ','

var e = /.*?[,\n\r]/; // Para finalizar agregamos una clase que contenga además de la como ',' un salto de línea

Este curso es una maravilla, me da superpoderes a futuro para validar datos!

Para encontrar [LOG ENTRY] o los mensajes como [ERROR], [WARN] y [LOG] en el archivo de texto lo hice de la siguiente manera:

\[\w*? ?\w*?\]

resultado:

Delimitador ?

Hasta el momento nos explicaron la función individual de cada delimitador, pero en esta clase se puso interesante ya que nos enseña cómo funcionan los delimitadores al combinarlos con ?

Tiene dos usos:


  • Buscar las ocurrencias de un carácter que pueden o no aparecer

  • Buscar las ocurrencias de ciertas condiciones en el grupo más pequeño existente

Oigan yo use esta expresión para buscar formatos de correos electrónicos

[email protected]+\..+

¿Alguien tiene un mejor idea?