Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: WHK en 8 Mayo 2015, 21:53



Título: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 8 Mayo 2015, 21:53
(http://4.bp.blogspot.com/_cS056lFRwew/ScFcrSdnrmI/AAAAAAAAB_A/MDvxB7rqdcc/s400/RegexBuddy.gif)

Hola, inicio este hilo para todo aquel que necesite una regla en expresión regular pero no tiene el conocimiento para hacerlo.

¿Cuantas veces hemos querido crear una regla con redirección de urls en apache o filtrar archivos en c# o parsear campos en Java y no lo podemos hacer porque no sabemos Exmpresiones regulares o son muy complejas?

Bueno, este hilo es para todos los que se sientan identificados con ello. No te sientas mal por no saber sobre Expresiones regulares, nadie nace con una enciclopedia bajo el brazo, todos aprendemos en algún momento, yo antes no sabía, ahora se algo y por eso quiero ayudar también a todo el que lo necesite.

Si eres una persona con conocimientos en Expresión regular entonces puedes ayudar a los que lo necesiten.


Herramientas para validar Expresiones, probar ejemplos y postearlos en el foro:

Validación de expresiones online
http://regexr.com/

Ejecución online de código javascript, CSS y HTML
https://jsfiddle.net/

Ejecución online de código ejecutable e interpretable:
http://runnable.com/


Bienvenidos todos y Enjoy!


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Pablo Videla en 8 Mayo 2015, 21:59
Excelente iniciativa, necesito expresiones regulares que detecte un apellido compuesto como un unico apellido por ejemplo:

Pedro De Videla Torres

De videla = 1er apellido, torres 2do apellido

Ena von Baer  Guzman

  von Baer 1er apellido Guzman 2do apellido.

Espero que se entienda =P Saludos y gracias de antemano  :)


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 8 Mayo 2015, 22:06
Te sirve así?
Código:
/([a-z]+\s+(de\s+la|de)\s+[a-z]+)/i

Primero busca una palabra que sería el primer nombre compuesto sobre el apellido con [a-z]+ el cual debe ser obligatorio, luego debe contener un espacio o tabulación , luego la concatenación común "de o de la como por ejemplo: de la costa", luego otro espacio y al final el último apellido. El argumento "i" es para que no sea sensible a las mayúsculas, en caso contrario habría que reemplazar [a-z] por [a-zA-Z].

Edito, agrego caracteres latinos:
Código:
/([a-zñÑáéíóúÁÉÍÓÚ]+\s+(de\s+la|de)\s+[a-za-zñÑáéíóúÁÉÍÓÚ]+)/i
ya que las exmpresiones regulares por defecto se trabajan en utf-8 sin soporte para carácteres latinos dependiendo del lenguaje de programación:

(http://i.elhacker.net/i?i=-zdslgrn77HDy3vCEYQ62GVo)

(http://i.elhacker.net/i?i=w4dT0YfDbMrazIwyOIRLtWVo)

Saludos.

Edito otraves,... acabo de ver tu edición xD, pues es dificil ya que todas las palabras ya sean nombres o apellidos cumplen con las mismas reglas, lo único que se me ocurre es tener una base de datos con nombres y apellidos y hacerles match con sql o similar. Por lo menos la expresión anterior te detecta apellidos que contenga "de" y "de la", se puede modificar para agregar mas tipos de concatenaciones.

Ejemplo online:
http://regexr.com/3ave5


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Pablo Videla en 8 Mayo 2015, 22:21
Gracias por la respuesta estoy probando pero no me resulta, hice este mini script para probar xD  y me dice nop, probe con "Pablo de videla torres" "pablo de la torre" "pablo de la torre guzman" cosas al azar pero no me da

Código
  1.  
  2.  
  3. function valida(){
  4. var prueba = "/([a-zñÑáéíóúÁÉÍÓÚ]+\s+(de|la)\s+[a-za-zñÑáéíóúÁÉÍÓÚ])/i";
  5. var campo = document.getElementById("campo");
  6. alert(campo.value);
  7. if ((campo.value.match(prueba)) && (campo.value!='')) {
  8.        alert('expresion Correcta');
  9.    } else {
  10.        alert("nop");
  11.        campo.focus();
  12.    }
  13. }
  14.  
  15.  
  16.  

Código
  1. <input type="text" id="campo"></input>
  2. <button id="bt" onclick="valida()">Prueba</button>


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 8 Mayo 2015, 22:33
Porque faltó el último apellido, prueba con este para validar el último apellido:
Código:
/([a-zñÑáéíóúÁÉÍÓÚ]+\s+((de\s+la|de)\s+)*[a-zñÑáéíóúÁÉÍÓÚ]+(\s+)*([a-zñÑáéíóúÁÉÍÓÚ]+)*)/i

Invertí las reglas, ahora la concatenación "de" y "de la" con opcionales y solo permite dos apellidos incluyendo uno concatenado aunque el último también es opcional.

Código
  1. function valida(){
  2. var prueba = "/([a-zñÑáéíóúÁÉÍÓÚ]+\s+((de\s+la|de)\s+)*[a-zñÑáéíóúÁÉÍÓÚ]+(\s+)*([a-zñÑáéíóúÁÉÍÓÚ]+)*)/i";
  3. var campo = document.getElementById("campo");
  4. alert(campo.value);
  5. if ((campo.value.match(prueba)) && (campo.value!='')) {
  6. alert('expresion Correcta');
  7. } else {
  8. alert("nop");
  9. campo.focus();
  10. }
  11. }

Pablo de videla torres -> Válido
pablo de la torre -> Válido
pablo de la torre guzman -> Válido
Pablo guzman -> Válido
pablo de la torre guzman abc def ghi -> inválido

Si quieres que la validación sea obligadamente apellidos concatenados entonces reemplaza ((de\s+la|de)\s+)* por ((de\s+la|de)\s+)+

Recuerda trabajar siempre con UTF-8 o si no tendrás que utilizar secuencia de escape para carácteres unicode en javascript o hexadecimales vy agregar múltiples condicionales para múltiples codificaciones, por eso mejor usa siempre utf-8 y no tendrás problemas con las validaciones en los acentos..


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 8 Mayo 2015, 22:52
Acá te lo dejo funcionando:
https://jsfiddle.net/0xm8vcvw/

Recuerda que la expresión regular puede hacer match en uno o mas regultados dentro del mismo string por lo cual debes comparar que el primer match sea igual a tu texto completo para saber si es verdadero o no.

Saludos.


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Pablo Videla en 8 Mayo 2015, 22:53
Que raro, copie exacto tu cambio y me sigue respondiendo "nop", que podría ser?

Probe tus ejemplos y me lo toma invalido. (Gracias por las recomendaciones, siempre trabajo con utf8 solo que esto es un PoC )

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


Tomare tu ultimo ejemplo no lo habia leido, gracias!


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 8 Mayo 2015, 22:58
Mira esto: https://jsfiddle.net/0xm8vcvw/5/

He modificado la expresión regular para que cada nombre y apellido deba contener por lo menos 3 carácteres hasta 15, así la validación es mayor y previenes la validación de textos como "Pablo el loco", también agregué la concatenación "de las" y "las" para validar nombres como por ejemplo "Pablo de las mercedes" o "Pablo las casas":

Código:
/([a-zñÑáéíóúÁÉÍÓÚ]{3,15}\s+((de\s+la|de\s+las|de|las)\s+)*[a-zñÑáéíóúÁÉÍÓÚ]{3,15}(\s+)*([a-zñÑáéíóúÁÉÍÓÚ]{3,15})*)/i


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Pablo Videla en 11 Mayo 2015, 18:01
Ahi me funciona, disculpa la demora se me habia estropeado el cargador  :xD es cosa de agregar mas palabras, es capaz de detectar el apellido compuesto en el lugar del materno en vez del paterno?


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 5 Julio 2015, 18:17
Pues es mas dificil a menos que cambies el orden pero tendras que adivinar o tener un diccionario de nombres y apellidos.

Acá les dejo un repositorio muy bueno sobre expresiones regulares y validaciones:
https://www.owasp.org/index.php/OWASP_Validation_Regex_Repository


Citar
Note
    These Regexs are examples and not built for a particular Regex engine. However, the PCRE syntax is mainly used. In particular, this means that character classes do not contain meta characters which need to be escaped, except the - and ] character, where it is assumed that a - needs not to be escaped only when it is the last character in a character class. The character class supports shortcut notations for other character classes like \s or \w which should not be used as they depend on the LOCALE environment setting in most systems.

Please carefully test the regex in your regex engine.

Código
  1. <?xml version="1.0"?>
  2.  
  3.  <regex>
  4.   <name>url</name>
  5.   <pattern><![CDATA[^((((https?|ftps?|gopher|telnet|nntp)://)|(mailto:|news:))(%[0-9A-Fa-f]{2}|[-()_.!~*';/?:@&=+$,A-Za-z0-9])+)([).!';/?:,][[:blank:]])?$]]></pattern>
  6.   <description>A valid URL per the URL spec.</description>
  7.  </regex>
  8.  
  9.  <regex>
  10.   <name>IP</name>
  11.   <pattern><![CDATA[^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$]]></pattern>
  12.   <description>A valid IP Address</description>
  13.  </regex>
  14.  
  15.  <regex>
  16.   <name>e-mail</name>
  17.   <pattern><![CDATA[^[a-zA-Z0-9+&*-]+(?:\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,7}$]]></pattern>
  18.   <description>A valid e-mail address</description>
  19.  </regex>
  20.  
  21.  <regex>
  22.   <name>safetext</name>
  23.   <pattern><![CDATA[^[a-zA-Z0-9 .-]+$]]></pattern>
  24.   <description>Lower and upper case letters and all digits</description>
  25.  </regex>
  26.  
  27.  <regex>
  28.   <name>date</name>
  29.   <pattern><![CDATA[^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$]]></pattern>
  30.   <description>Date in US format with support for leap years</description>
  31.  </regex>
  32.  
  33.  <regex>
  34.   <name>creditcard</name>
  35.   <pattern><![CDATA[^((4\d{3})|(5[1-5]\d{2})|(6011)|(7\d{3}))-?\d{4}-?\d{4}-?\d{4}|3[4,7]\d{13}$]]></pattern>
  36.   <description>A valid credit card number</description>
  37.  </regex>
  38.  
  39.  <regex>
  40.   <name>password</name>
  41.   <pattern><![CDATA[^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{4,8}$]]></pattern>
  42.   <description>4 to 8 character password requiring numbers and both lowercase and uppercase letters</description>
  43.  </regex>
  44.  
  45.  <regex>
  46.   <name>complexpassword</name>
  47.   <pattern><![CDATA[^(?:(?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))(?!.*(.)\1{2,})[A-Za-z0-9!~<>,;:_=?*+#."&§%°()\|\[\]\-\$\^\@\/]{8,32}$]]></pattern>
  48.   <description>4 to 32 character password requiring at least 3 out 4 (uppercase and lowercase letters, numbers and special characters) and no more than 2 equal characters in a row</description>
  49.  </regex>
  50.  
  51.  <regex>
  52.   <name>English_digitwords</name>
  53.   <pattern><![CDATA[^(zero|one|two|three|four|five|six|seven|eight|nine)$]]></pattern>
  54.   <description>The English words representing the digits 0 to 9</description>
  55.  </regex>
  56.  
  57.  <regex>
  58.   <name>English_daywords</name>
  59.   <pattern><![CDATA[^(Mo|Tu|We|Th|Fr|Sa|Su)$]]></pattern>
  60.   <description>English 2 character abbreviations for the days of the week</description>
  61.  </regex>
  62.  
  63.  <regex>
  64.   <name>English_monthwords</name>
  65.   <pattern><![CDATA[^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)$]]></pattern>
  66.   <description>English 3 character abbreviations for the months</description>
  67.  </regex>
  68.  
  69.  <regex>
  70.   <name>French_digitwords</name>
  71.   <pattern><![CDATA[^(z[eé]ro|un|deux|trois|quatre|cinq|six|sept|huit|neuf)$]]></pattern>
  72.   <description>The French words representing the digits 0 to 9</description>
  73.  </regex>
  74.  
  75.  <regex>
  76.   <name>German_digitwords</name>
  77.   <pattern><![CDATA[^(null|eins|zwei|drei|vier|f(ue|ü)nf|sechs|sieben|acht|neun)$]]></pattern>
  78.   <description>The German words representing the digits 0 to 9</description>
  79.  </regex>
  80.  
  81.  <regex>
  82.   <name>Spanish_digitwords</name>
  83.   <pattern><![CDATA[^(cero|uno|dos|tres|cuatro|cinco|seis|siete|ocho|nueve)$]]></pattern>
  84.   <description>The Spanish words representing the digits 0 to 9</description>
  85.  </regex>
  86.  
  87.  <regex>
  88.   <name>US_zip</name>
  89.   <pattern><![CDATA[^\d{5}(-\d{4})?$]]></pattern>
  90.   <description>US zip code with optional dash-four</description>
  91.  </regex>
  92.  
  93.  <regex>
  94.   <name>US_phone</name>
  95.   <pattern><![CDATA[^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$]]></pattern>
  96.   <description>US phone number with or without dashes</description>
  97.  </regex>
  98.  
  99.  <regex>
  100.   <name>US_state</name>
  101.   <pattern><![CDATA[^(AE|AL|AK|AP|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MP|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY)$]]></pattern>
  102.   <description>2 letter U.S. state abbreviations</description>
  103.  </regex>
  104.  
  105.  <regex>
  106.   <name>US_ssn</name>
  107.   <pattern><![CDATA[^\d{3}-\d{2}-\d{4}$]]></pattern>
  108.   <description>9 digit U.S. social security number with dashes</description>
  109.  </regex>
  110.  
  111.  <!-- Some additional examples that have not been vetted
  112.  
  113.       // HTML HEX CODE   ^#?([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$
  114.       // FLOATING POINT   ^[-+]?[0-9]+[.]?[0-9]*([eE][-+]?[0-9]+)?$
  115.       // PERSON NAME   ^[a-zA-Z]+(([',. -][a-zA-Z ])?[a-zA-Z]*)*$
  116.       // MAC ADDRESS  ^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
  117.       // GUID    ^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$
  118.       // IP ADDRESS  ^\b((25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)\b$
  119.       // IP ADDRESS (^\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b$
  120.       // REASONABLE DOMAIN NAME   ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$
  121.       // RFC 1918 NON ROUTABLE IP   ^(((25[0-5]|2[0-4][0-9]|19[0-1]|19[3-9]|18[0-9]|17[0-1]|17[3-9]|1[0-6][0-9]|1[1-9]|[2-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]))|(192\.(25[0-5]|2[0-4][0-9]|16[0-7]|169|1[0-5][0-9]|1[7-9][0-9]|[1-9][0-9]|[0-9]))|(172\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|1[0-5]|3[2-9]|[4-9][0-9]|[0-9])))\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$
  122.       // VALID WINDOWS FILENAME  ^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\";|/]+$
  123.       //
  124.       //
  125.       // Warning, per http://en.wikipedia.org/wiki/ReDoS the Java Classname RegEx below is vulnerable to RegExDos
  126.       // Java Classname  ^(([a-z])+.)+[A-Z]([a-z])+$
  127.       //
  128.       //  ANY PLATFORM FILENAME   ^(([a-zA-Z]:|\\)\\)?(((\.)|(\.\.)|([^\\/:*?"|<>. ](([^\\/:*?"|<>. ])|([^\\/:*?"|<>]*[^\\/:*?"|<>. ]))?))\\)*[^\\/:*?"|<>. ](([^\\/:*?"|<>. ])|([^\\/:*?"|<>]*[^\\/:*?"|<>. ]))?$
  129.  -->
  130.  

Yo uso muchos de ellos en mis desarrollos.

Saludos.


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 5 Julio 2015, 18:32
Obtener el contenido entre etiquetas XHTML:

Código
Código:
<div id="demo">Contenido</div>

Expresión
Código:
/<div\sid="demo">(.+?)<\/div>/si

Resultado:
Código:
Contenido


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Eleкtro en 5 Julio 2015, 18:33
Pues aquí va una expresión regular para capturar una Ipv6:
Código
  1.        ''' ----------------------------------------------------------------------------------------------------
  2.        ''' <summary>
  3.        ''' A pattern that matches an IPv6 address.
  4.        '''
  5.        ''' For Example:
  6.        ''' FE80:0000:0000:0000:0202:B3FF:FE1E:8329
  7.        ''' </summary>
  8.        ''' ----------------------------------------------------------------------------------------------------
  9.        Public Const Ipv6 As String =
  10.            "(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))"

o una Ipv4, cómo expresión alternativa a la que ha publicado WHK:
Código
  1.        ''' ----------------------------------------------------------------------------------------------------
  2.        ''' <summary>
  3.        ''' A pattern that matches an IPv4 address.
  4.        '''
  5.        ''' For Example:
  6.        ''' 127.0.0.1
  7.        ''' </summary>
  8.        ''' ----------------------------------------------------------------------------------------------------
  9.        Public Const Ipv4 As String =
  10.            "((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])"

PD: Sintaxis VB.Net

Saludos


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 5 Julio 2015, 18:50
Está bueno agrupar en 3 el grupo de la red a diferencia de la de owasp que las hace por separado, pero de todas maneras deberías agregarle el comienzo ^ y el final $ o si no cuando uses esa validación en un campo de texto que solo soporte un valor de ip validará texto basura antes y después de la ip como por ejemplo:

Código:
127.0.0.1' union select '1

Dando paso a una inyección SQL :P

Código:
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' A pattern that matches an IPv4 address.
'''
''' For Example:
''' 127.0.0.1
''' </summary>
''' ----------------------------------------------------------------------------------------------------
Public Const Ipv4 As String = "^((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])$"

En ese caso a tu clase deberías agregarle una opción booleana que indique si debe realizar una validación exacta o parcial, o sea con todo el contenido o parte de el en el caso que quieras validar ya que en tu código solo estás buscando una ip y no validando.


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 5 Julio 2015, 19:11
Validación de URL:

Código:
^((mailto\:|(news|(ht|f)tp(s?))\:\/\/){1}\S+)$

Ejemplos:
Código:
http://www.google.cl/
ftp://www.google.cl/
mailto:demo@google.com


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Pablo Videla en 6 Julio 2015, 14:33
Pero que buen aporte WHK, muchas gracias  ;-) ;-) ;-)


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Eleкtro en 23 Septiembre 2015, 14:58
Tengo una expresión regular que me está volviendo loco, la utilizo en Pascalscript en combinación con otras expresiones, y ya no se cómo tratar de mejorar más este RegEx, no hace lo que yo quiero en ciertas circunstancias.

¡A ver si alguien me puede echar una mano!.

La expresión:
Código:
\A([^\-]*?)\s*\-\s*(.*?)\s*([\(\[])?((ft[\.\s]|feat[\.\s]|featuring[\.\s])[^\(\)\{\}\[\]]*)([\)\]])?(.+)?\Z

Reemplazamiento por:
Código:
$1 $4 - $2$7

Nombres de archivo de prueba:
  • kill the noise - all in my head feat. awolnation (batou mix)
  • artist - track name feat. Mister 漢字仮----名交じり文 [usa remix]
  • kill th-e noise - all in my head (feat awolnation)

La supuesta finalidad de esta expresión que diseñé, cómo ya habreis supuesto, debería servir para extraer la parte "feat..." del nombre del archivo, y colocarlo al principio del string junto al nombre del artista.

Por ejemplo:

De:
Código:
kill the noise - all in my head feat. awolnation (batou mix)
A:
Código:
kill the noise feat. awolnation - all in my head (batou mix)


De:
Código:
artist - track name feat. Mister 漢字仮--名交じり文 [usa remix]
A:
Código:
artist feat. Mister 漢字仮--名交じり文 - track name [usa remix]


La expresión funciona bien, excepto cuando en el nombre del archivo existe algún guión de más antes del string "feat..."

Por ejemplo, esto:
Código:
kill th-e noise - all in my head (feat awolnation)
Me lo reemplaza por esto otro:
Código:
Kill Th Feat. Awolnation-E Noise - All In My Head
Cuando realmente debería reemplazarlo así:
Código:
Kill Th-E Noise Feat. Awolnation - All In My Head


Los nombres de los archivos se puede desglosar así:
Código:
NOMBRE_ARTISTA - NOMBRE_CANCION FEATURING_ARTISTA (POSIBLE_TEXTO_EN_PARENTESIS)


Me está siendo muy complicado idear la lógica, ya que "NOMBRE_ARTISTA" puede contener un nombre con uno o varios guiones, al igual que "NOMBRE_CANCION", "FEATURING_ARTISTA" o "POSIBLE_TEXTO_EN_PARENTESIS" pueden tener nombres con guión, por ejemplo:
Código:
Dj E-nergy C-21 - My Super-hero track! (feat Dj Ass-hole)

Eso ya es dificil ...he?.

Lo realmente complicado es que "NOMBRE_ARTISTA" - "NOMBRE_CANCION" se separa por otro guión, y entonces no se cuando parar de capturar.

¿A alguien se le ocurre algo?, no importa que la expresión sea perfecta ...creo que no existe el modo de que sea perfecta debido a los guiones (imposible predecir cuando hay que separar  "NOMBRE_ARTISTA" de "NOMBRE_CANCION"), pero si que busco ayuda para mejorar lo que tengo, que no trabaja del todo bien.

Puedo aplicar varias expresiones distintas para ir formateando el string  que as´uedcnado para usar una e siguiente RegEx ...si eso ayuda, ya que en una sola expresión dudo que pueda hacerlo todo bien.

Saludos!


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: explorer en 27 Septiembre 2015, 20:46
Hola. He encontrado una solución, pero como no conozco Pascalscript, yo he usado Perl v5.18:
Código:
#!/usr/bin/perl
use v5.18; # garantizamos un buen soporte de Unicode
use utf8::all; # activamos todo el soporte para UTF-8
use re '/xu'; # las exp. reg. tendrán estas opciones, por defecto

my @tests =
( 'kill the noise - all in my head feat. awolnation (batou mix)'
, 'artist - track name feat. Mister 漢字仮--名交じり文 [usa remix]'
, 'kill th-e noise - all in my head (feat awolnation)'
, 'Dj E-nergy C-21 - My Super-hero track! featuring Dj Ass-hole (usa remix)'
, 'Dj E-nergy C-21 - My Super-hero track! (feat Dj Ass-hole)'
);

my $del1 = qr/[([]/;
my $del2 = qr/[])]/;
my $featuring = qr/
   (?<d1>$del1)?
   (?<featuring>feat(?:uring|[.]|) \s .+?)
   (?(<d1>)$del2)
/;
my $artista = qr/(?<artista>.+?)/;
my $resto = qr/
   (?<cancion>.+?) \s+
   (?:$featuring \s*)?
   (?<extra>$del1 .+? $del2)?
   $
/;
my $titulo = qr/^ $artista \s+ - \s+ $resto $/;


for my $test (@tests) {

    $test =~ /$titulo/;

    say $test;
    say join " ", @+{qw(artista featuring)}, '-', @+{qw(cancion extra)};
    say '-' x 30;
}
Lo que sale es:
Código:
kill the noise - all in my head feat. awolnation (batou mix)
kill the noise feat. awolnation - all in my head (batou mix)
------------------------------
artist - track name feat. Mister 漢字仮--名交じり文 [usa remix]
artist feat. Mister 漢字仮--名交じり文 - track name [usa remix]
------------------------------
kill th-e noise - all in my head (feat awolnation)
kill th-e noise feat awolnation - all in my head
------------------------------
Dj E-nergy C-21 - My Super-hero track! featuring Dj Ass-hole (usa remix)
Dj E-nergy C-21 featuring Dj Ass-hole - My Super-hero track! (usa remix)
------------------------------
Dj E-nergy C-21 - My Super-hero track! (feat Dj Ass-hole)
Dj E-nergy C-21 feat Dj Ass-hole - My Super-hero track!
------------------------------


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Eleкtro en 28 Septiembre 2015, 13:20
(Los códigos que aparecen &#28450; y demás, no son del código original, sino los caracteres originales del título de la canción. Si no se ven, es por limitaciones de este foro, que no representa esos caracteres).

Es un bug que llevo años reportando de vez en cuando, pero nadie me hace caso. Una solución temporal es que uses la etiqueta CODE, tal cual, sin especificar un valor de GeShi.



Hola. He encontrado una solución, pero como no conozco Pascalscript, yo he usado Perl v5.18:

Te agradezco muchísimo la ayuda prestada!!, pero desgraciadamente una solución en Perl no me serviría, si yo pudiese utilizar un script en el lenguaje que sea para resolver el problema entonces si, pero no es posible por que utilizo el programa para aplicar muchos filtros, transiciones de caracteres, RegEx y demás (en total más de 70 cosas), trasladar toda la lógica a otro lenguaje sería complejo y para mi supondría desarrollar una GUI también xD.

El programa está desarrollado en Delphi (imagino que usará el motor RegEx de Delphi/Object-Pascal), con soporte adicional para usar scripts en pascal-script.



En StackOverflow formulé esta misma pregunta, aquí pueden encontrar más detalles:
➢ http://stackoverflow.com/questions/32807698/regex-pattern-to-limit-dashes-in-these-circumstances

Desglosemos imaginariamente los nombres de archivo de esta manera:
Código:
[0]ARTIST   [1]DASH   [2]TRACK   [3]FEAT_ARTIST   [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}

Pues verás, yo llegué a la conclusión de que es imposible que exista una lógica para determinar cuando se debe separar (0)ARTIST de (2)TRACK, ya que ambos pueden contener varios guiones (Dj E-Nergy C-21 - Nombre-de-cancion feat loquesea), yo llegué a esa conclusión así que lo que intenté fue hacer algo mucho más realista, una exclusión, es decir, si (0)ARTIST o (2)TRACK contienen 1 guión, no modificar el string, limitar los guiones a uno algo cómo esto (\-){1} pero me has desarmado completamente al igual que el usuario que me respondió en StackOverflow mostrándome otra solución en Perl, ya no se si la conclusión a la que llegué fue inequivoca o no.

Cita de: explorer
Dj E-nergy C-21 - My Super-hero track! featuring Dj Ass-hole (usa remix)
Dj E-nergy C-21 featuring Dj Ass-hole - My Super-hero track! (usa remix)

Por ese motivo no entiendo en absoluto cual es la lógica que hay detrás para lograr separar correctamente los tokens del nombre del archivo cuando contienen varios guiones, ya que si no eres un humano no se puede saber lo que pertenece a un nombre y lo que no, ¿podrías explicármelo como lo conseguiste?, ¿supuestamente funcionará a pesar de la cantidad de guiones que pueda haber, sin margen de error?, para mi eso es mágia, no lo entiendo.

EDITO: Ah claro, ya lo entiendo, se busca un guión separado por espacios " - ", por eso sabes cuando partir, pero entonces eso no me sirve ya que el nombre del artista o el nombre de la canción también pueden contener un guión con espacios.

¡Ya decía yo que era imposible!. Entonces lo que realmente necesito es excluir los nombres, limitar la funcionalidad del Regex cuando solo exista un guión con espacios " - ", si se encuentran más guiones con espacios antes de la parte "...feat artists" entonces no modificar nada.

De todas formas, analizaré las partes de tu regex a ver si las puedo combinar en el orden en el que usas el join, a ver si de casualidad me funciona en el programa, pero yo creo que no me va a aceptar la sintaxis de (?:...).

Un saludo!


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: explorer en 7 Octubre 2015, 17:40
La sintaxis (?:...) se refiere a que esos paréntesis solo van a agrupar expresiones, no queremos que capturen nada.

El motor RegEx está creada alrededor de la biblioteca PCRE (Perl Compatible Regular Expressions), así que la traducción debería ser fácil (bueno, es cierto que estoy usando "features" de los últimos Perl, así que es normal que la traducción sea complicada. En Stackoverflow te dan expresiones regulares más normales).

EDITO: ¡Ah, claro, ya lo entiendo! Se busca un guión separado por espacios " - ", por eso sabes cuando partir, pero entonces eso no me sirve ya que el nombre del artista o el nombre de la canción también pueden contener un guión con espacios.
Sí, pero en los ejemplos mostrados no hay ningún nombre de artista que tenga un guión con espacios, así que se supone que esa es el "ancla" que podemos usar para hacer la partición. Y como se parte por la primera aparición de esa estructura, no importa que aparezca después en el nombre de la canción.

Voy a ver si puedo simplificarla un poco para que la puedas meter en el Delphi, pero creo que es casi idéntica a la que te dan en StackOverflow.


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: explorer en 8 Octubre 2015, 03:39
He mejorado un poco la exp. reg., y he añadido todos los ejemplos que pusiste en StackOverflow:

Código:
#!/usr/bin/env perl
use v5.18; # garantizamos un buen soporte de Unicode
use utf8::all; # activamos todo el soporte para UTF-8
use re '/xiu'; # las exp. reg. tendrán por defecto estas opciones

my @tests =
( 'kill the noise - all in my head feat. awolnation (batou mix)'
, 'artist - track name feat. Mister 漢字仮--名交じり文 [usa remix]'
, 'kill th-e noise - all in my head (feat awolnation)'
, 'Dj E-nergy C-21 - My Super-hero track! featuring Dj Ass-hole (usa remix)'
, 'Dj E-nergy C-21 - My Super-hero track! (feat Dj Ass-hole)'
, 'Dj E-nergy C-21 - My Super-hero track! feat Dj Ass-hole'
, 'Dj E-nergy C-21 - My Super-hero track!'
, 'Carbin & Sirmark - Sorry Feat. Sevener'
, 'Flight Facilities - Heart Attack Feat. Owl Eyes (Snakehips Remix)'
, 'Flight Facilities - Heart Attack Feat. Owl Eyes [Snake--hips Remix]'
, 'Fedde Le Grand - Cinematic'
, 'Fedde Le Grand Feat. Denny White - Cinematic'
, 'Artist-Name - Track Name feat someone'
, 'Artist Name - Track-Name feat someone'
);

my $del1 = qr/[([]/;
my $del2 = qr/[])]/;
my $featuring = qr/
    (?<d1>$del1)?
    (?<featuring>feat(?:uring|[.]|) \s .+?)
    (?(<d1>)$del2)
/;
my $artista = qr/(?<artista>.+?)/;
my $resto = qr/
    (?<cancion>.+?) \s*
    (?:$featuring)? \s*
    (?<extra>$del1 .+? $del2)?
/;
my $titulo = qr/^ $artista \s+ - \s+ $resto \s* $/;


for my $test (@tests) {

    $test =~ /$titulo/;

    say $test;
    print $+{'artista'};
    for my $text (qw(featuring - cancion extra)) {
        if ($text eq '-') {
            print " -";
        }
        elsif ($+{$text}) {
            print " " . $+{$text};
        }
    }
    print "\n";
#    say join " ", @+{qw(artista featuring)}, '-', @+{qw(cancion extra)};
    say '-' x 30;
}

say $titulo;
El resultado es el esperado:

Código:
kill the noise - all in my head feat. awolnation (batou mix)
kill the noise feat. awolnation - all in my head (batou mix)
------------------------------
artist - track name feat. Mister 漢字仮--名交じり文 [usa remix]
artist feat. Mister 漢字仮--名交じり文 - track name [usa remix]
------------------------------
kill th-e noise - all in my head (feat awolnation)
kill th-e noise feat awolnation - all in my head
------------------------------
Dj E-nergy C-21 - My Super-hero track! featuring Dj Ass-hole (usa remix)
Dj E-nergy C-21 featuring Dj Ass-hole - My Super-hero track! (usa remix)
------------------------------
Dj E-nergy C-21 - My Super-hero track! (feat Dj Ass-hole)
Dj E-nergy C-21 feat Dj Ass-hole - My Super-hero track!
------------------------------
Dj E-nergy C-21 - My Super-hero track! feat Dj Ass-hole
Dj E-nergy C-21 feat Dj Ass-hole - My Super-hero track!
------------------------------
Dj E-nergy C-21 - My Super-hero track!
Dj E-nergy C-21 - My Super-hero track!
------------------------------
Carbin & Sirmark - Sorry Feat. Sevener
Carbin & Sirmark Feat. Sevener - Sorry
------------------------------
Flight Facilities - Heart Attack Feat. Owl Eyes (Snakehips Remix)
Flight Facilities Feat. Owl Eyes - Heart Attack (Snakehips Remix)
------------------------------
Flight Facilities - Heart Attack Feat. Owl Eyes [Snake--hips Remix]
Flight Facilities Feat. Owl Eyes - Heart Attack [Snake--hips Remix]
------------------------------
Fedde Le Grand - Cinematic
Fedde Le Grand - Cinematic
------------------------------
Fedde Le Grand Feat. Denny White - Cinematic
Fedde Le Grand Feat. Denny White - Cinematic
------------------------------
Artist-Name - Track Name feat someone
Artist-Name feat someone - Track Name
------------------------------
Artist Name - Track-Name feat someone
Artist Name feat someone - Track-Name
------------------------------
(?^uix:^ (?^uix:(?<artista>.+?)) \s+ - \s+ (?^uix:
    (?<cancion>.+?) \s*
    (?:(?^uix:
    (?<d1>(?^uix:[([]))?
    (?<featuring>feat(?:uring|[.]|) \s .+?)
    (?(<d1>)(?^uix:[])]))
))? \s*
    (?<extra>(?^uix:[([]) .+? (?^uix:[])]))?
) \s* $)
El último say muestra la exp. reg. completa, que es lo que sale al final de la ejecución.

He visto que la biblioteca PCRE2 sí que tiene soporte para capturas con nombres (http://www.pcre.org/current/doc/html/pcre2pattern.html#SEC16), que se hace casi indispensable en este caso. No sé si el control Regex de Delphi soporta la PCRE2 o si aún sigue con la PCRE.



Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 8 Octubre 2015, 05:24
Yo llegué hasta acá:

http://regexr.com/3buj9
Código:
/(.*)?\s+-\s+(.+)?(featuring\s.*|feat\s.*|feat\..*)/ig

Entre intentar buscar los que dicen o no dicen feat y los que tienen guion al comienzo y los que no, llegué a la conclusión de que era necesario por lo menos 3 expresiones distintas para poder hacer match y dependiendo del match hacer el reemplazo. Ya es tarde, mañana veré si les doy una mano porque ando hasta el cuello con trabajos.


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Eleкtro en 8 Octubre 2015, 12:52
Muchas gracias WHK, probaré esa expresión.

De todas formas la solución actual que tengo ahora mismo es con esta expresión, en la cual me ayudaron a construirla:
Código:
^(.+)\s+-\s+(.+?)\s+[fF](t|eat(uring)?)?\.?([^([\])\n]+)(.+)?$

Pero hay un problema, según parece es imposible construir una expresión regular que sea 100% eficiente debido a la cantidad de guiones y espacios que pueden contener los nombres de archivos (como yo decía al principio), al menos eso es lo que me dijo el que me ayudó con esa expresión, entonces yo mismo desarrollé el siguiente script en pascal-script para ignorar los nombres de archivos que contengan más de un " - " ya que la eficiencia para estos renombramientos de archivo necesito que sea perfecta, prefiero omitir reemplazamientos y revisar manualmente los nombres que se omitieron.

Estoy convencido que si alguien suele descargar archivos de audio, entonces esta expresión, o la de @Explorer y la de @WHK les podrá servir de mucha ayuda!.

(este script se utiliza con la aplicación Renamer Pro: http://www.den4b.com/?x=products )
Código
  1. // Formats an audio filename that has the "...featuring artist" part at the end of filename.
  2. //------------------------------------------------------------------------------------------
  3.  
  4.  
  5. // Pseudo-Example:
  6. //
  7. // From: [0]ARTIST_NAME  [1]DASH  [2]TRACK_TITLE  [3]FEAT_ARTIST  [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
  8. // To:   [0]ARTIST_NAME  [3]FEAT_ARTIST  [1]DASH  [2]TRACK_TITLE  [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
  9.  
  10. // Real-Example:
  11. //
  12. // From: Carbin & Sirmark - Sorry Feat. Sevener.mp3
  13. // To:   Carbin & Sirmark Feat. Sevener - Sorry.mp3
  14.  
  15. // Known limitations:
  16. //
  17. // • If [0]ARTIST_NAME or [2]TRACK_TITLE parts contains any " - " the script will not work properlly.
  18. //   By default the script prevents any replacement on that kind of filenames, so don't worry.
  19.  
  20.  
  21. var
  22.  rgxPattern: string;
  23.  rgxReplace: string;
  24.  dashCount: integer;
  25.  baseName: string;
  26.  extension: WideString;
  27.  
  28. begin
  29.  
  30.  baseName  := WideExtractBaseName(FileName)
  31.  extension := WideExtractFileExt(FileName);
  32.  
  33.  // The regular expression that matches the filename parts.
  34.  // http://stackoverflow.com/questions/32807698/regex-pattern-to-limit-dashes-in-these-circumstances
  35.  rgxPattern := '^(.+)\s+-\s+(.+?)\s+[fF](t|eat(uring)?)?\.?([^([\])\n]+)(.+)?$'
  36.  rgxReplace := '$1 Feat.$5 - $2$6'
  37.  
  38.  // The amount of " - " that contains the filename.
  39.  dashCount := high(MatchesRegEx(baseName, '\s-\s' , false));
  40.  
  41.  // If only one " - " is found then...
  42.  If (dashCount = 0) Then
  43.    begin // Do the replacement.
  44.      baseName := ReplaceRegEx(baseName, rgxPattern, rgxReplace, false, true)
  45.      FileName := baseName + extension;
  46.    end;
  47.  
  48. end.

Saludos!


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: ThinkByYourself en 23 Abril 2017, 16:04
Hola!

Hace tiempecillo que no se toca este hilo.

El caso es que busco la expresión de regular de la expresión regular de javascript en javascript.

Me sería de mucha ayuda, y la verdad que es una búsqueda que en gogle no me se da bien...

A ver si alguien me sabe decir.

Un saludo!


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: #!drvy en 23 Abril 2017, 16:46
Citar
El caso es que busco la expresión de regular de la expresión regular de javascript en javascript.

¿Podrías poner ejemplos o explicarlo mejor? Eso no tiene mucho sentido.

Saludos


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: ThinkByYourself en 23 Abril 2017, 21:57
Claro! La expresión regular sería para encontrar expresiones regulares de js en un string. Pero la expresión regular tendría que servir como RegExp de js. Las que al vuelo simplemente /miregex/g.


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: WHK en 23 Abril 2017, 22:07
Código:
(\/.*?\/.*)

Así?

http://regexr.com/3fqc1


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: ThinkByYourself en 24 Abril 2017, 19:24
Si, algo así, pero debería cubrir todas las opciones. Lo tricky viene cuando:

/\\\// --> debería pasar
/\\/ --> debería pasar
/\\\/ --> no debería pasar porque no está cerrada

Y tengo mis dudas. Se debe hacer con los operadores especiales supongo, de ? y !, que no los pillo porque en unos sitios van y en otros no.
Sólo puede cerrarse con /, pero no valdría decirle [^/]+.
Sería algo que aceptara \/ o cualquier cosa que no sea / hasta encontrar /.

(Que en verdad no sería eso, porque dentro de [ y ] el / creo que sí se puede poner. Y ahí se vuelve un poco locura. Pero yo la he visto esa regex. Existe xD).

La solución que das es la que tengo provisional. A ver si la encuentro



Estoy desde el móvil. Pero la encontré. Aquí está:

(http://imgh.us/Screenshot_2017-04-24-20-13-01.jpg)

Lo que pasa que está escrita en CoffeeScript, ojo. Para js hay que adaptarla.

Pro esta debería ser, la regex de las regex de js.


Saludos!

MOD: Imagen redimensionada a lo permitido.
Mod: No hacer doble post.


Título: Re: Hilo oficial: Solicitudes de Expresiones Regulares
Publicado por: Miseryk en 22 Junio 2018, 16:35
Buenas, estaba buscando una expresión que no sé como terminarla, para no volver a postear todo, lo había posteado acá por error: https://foro.elhacker.net/scripting/regex-t484967.0.html (https://foro.elhacker.net/scripting/regex-t484967.0.html)