mirror of
https://github.com/pissnet/pissircd.git
synced 2025-07-29 14:32:25 +01:00
Informacion sobre las regexp
This commit is contained in:
parent
bb192d3016
commit
4f93681c71
1 changed files with 95 additions and 1 deletions
|
@ -119,6 +119,16 @@ Spanish |
|
|||
---8.8. <a href="#secantiexploit">Protección contra agujeros explotables</a><br>
|
||||
---8.9. <a href="#secsummary">Sumario</a><br>
|
||||
9. <a href="http://www.vulnscan.org/UnrealIrcd/faq/" target="_blank">Dudas más comunes (FAQ)</a><br>
|
||||
A. <a href="#regex">Expresiones Regulares</a><br>
|
||||
---A.1. <a href="#regexlit">Literales</a><br>
|
||||
---A.2. <a href="#regexdot">Operador punto</a><br>
|
||||
---A.3. <a href="#regexrep">Operadores de repetición</a><br>
|
||||
---A.4. <a href="#regexbracket">Expresiones de corchete</a><br>
|
||||
---A.5. <a href="#regexassert">Aserciones</a><br>
|
||||
---A.6. <a href="#regexalt">Alternanza</a><br>
|
||||
---A.7. <a href="#regexsub">Subexpresiones</a><br>
|
||||
---A.8. <a href="#regexbackref">Referencias anteriores</a><br>
|
||||
---A.9. <a href="#regexcase">Sensibilidad mayúsculas/minúsculas</a><br>
|
||||
</p>
|
||||
<p><b><font size="+2">1.0 – Introducción y notas <a name="IntroductionNotes"></a></font></b><br>
|
||||
</p><div class="desc">
|
||||
|
@ -2987,5 +2997,89 @@ Tal y como podrá entender, nunca se puede estar 100% seguro. Sin embargo,
|
|||
<p>Tiene una FAQ disponible en este <a href="http://www.vulnscan.org/UnrealIrcd/faq/" TARGET="_blank">enlace</a></p>
|
||||
</div>
|
||||
<p></p>
|
||||
</body>
|
||||
|
||||
<p><font size="+2"><b>A Expresiones Regulares<a name="regex"></a></b></font></p>
|
||||
<div class="desc">
|
||||
<p>Las expresiones regulares se usan en muchos sitios del Unreal, incluyendo badwords, el filtro de spam y aliases. Es una utilidad bastante compleja que sirve para relacionar coincidencias siguiendo un patrón. A veces se les llama "regexp" o "regex". Unreal usa la biblioteca TRE para estas regex. Soporta complejas y avanzadas expresiones que pueden ser confusas. La información que hay a continuación le ayudará a conocer cómo funcionan estas expresiones. Si está interesado en una información más detallada y técnica, puede visitar <a href="http://www.laurikari.net/tre/syntax.html" target="_new">TRE homepage</a>.</p>
|
||||
</div>
|
||||
|
||||
<p><font size="+2"><b>A.1 Literales<a name="regexlit"></a></b></font></p>
|
||||
<div class="desc">
|
||||
<p>Los literales son los componentes más básicos de las regexp. Básciamente son los caracteres tratados como texto plano. Por ejemplo, el patrón "test" consiste en cuatro literales: "t", "e", "s" y "t". En el Unreal, los literales son tratados sin sensibilidad de mayúsculas/minúsculas; así, el texto anterior coincidiría con "test" y "TEST". Cualquier caracter que no es un marcador es tratado como literal. Puede especificar un marcador como literal anteponiendo la barra invertida (\). Por ejemplo, el punto (.) es un marcador. Si quiere usarlo como literal, deberá poner \. y el Unreal lo tratará como tal. Puede darse el caso que desee usar un caracter que no está en el teclado, por ejemplo el de color (en ASCII el 3, color). Para eso puede usar la secuencia \x. Si usa \x3 entonces es interpretado como un caracter ASCII, el 3. El número que sigue a \x está notado como hexadecimal y debe estar entre el rango \x0 y \xFF.</p>
|
||||
</div>
|
||||
|
||||
<p><font size="+2"><b>A.2 Operador punto<a name="regexdot"></a></b></font></p>
|
||||
<div class="desc">
|
||||
<p>El operador punto (.) se usa para relacionar "cualquier caracter". Relaciona cualquier caracter simple que contenga cualquier valor. Por ejemplo, la regex "a.c" relacionaría con "abc", "adc", etc. Sin embargo, no lo haría con "abd" porque "a" y "c" son literales que deben coincidir exactamente.</p>
|
||||
</div>
|
||||
|
||||
<p><font size="+2"><b>A.3 Operadores de repetición<a name="regexrep"></a></b></font></p>
|
||||
<div class="desc">
|
||||
<p>Un error de los más usuales que se cometen es hacer que regex actúe como lo hacen los comodines. En otras palabras, el * y el ? sólo se relacionan con los comodines. En las regex no tienen el mismo sentido. Además, las expresiones regulares soportan muchos más métodos avanzados de repetición.
|
||||
<p>
|
||||
El operador de repetición más básico es el ?. Este operador relaciona 0 o 1 vez el caracter que le precede. Por ejemplo, en el caso "a?c" se relacionaría con cualquier palabra que tuviera la "a" repetida 0 o 1 vez seguida de la letra "c". Como se ve, el sentido es diferente que en los comodines. Si se usara "a.?c" entonces sí que el sentido sería el mismo de los comodines, puesto que significaría una "a" seguida de cualquier caracter repetido 0 o 1 vez seguido de una "c".
|
||||
<p>
|
||||
El siguiente operador es el *. Asimismo, es distinto al de los comodines. Se relaciona si el caracter que le precede se repite 0 o más veces. Por ejemplo, "a*c" relaciona 0 o más de una "a" seguida de una "c". La palabra "aaaac" relacionaría. Asimismo, "a.*c" significaría que se relaciona con una "a" seguida de cualquier caracter repetido 0 o más veces seguido de una "c", lo mismo que "a*c" en los comodines.
|
||||
<p>
|
||||
El operador + es similar al *. Sin embargo, en vez de hacerlo en 0 o más veces, lo hace con 1 o más veces. Por ejemplo, "a+c" significaría que la "a" debe estar "almenos" 1 vez. Por ejemplo, la palabra "c" relacionaría con "a*c" (puesto que la "a" está 0 o más veces) pero no lo haría con "a+c" (porque la "a" debe estar almenos 1 vez). En cambio "ac" o "aaaac" sí que lo harían con "a+c" (y por supuesto "a*c").
|
||||
<p>
|
||||
El operador de repetición más usual son las llaves. Te permiten especificar exactamente cuántas veces debe repetirse. Su formato es {M,N}, donde M es el mínimo y N el máximo de repeticiones. Por ejemplo, si quiere que la "a" se repita de 3 a 5 veces deberá usar "a{3,5}". Si usa "a{8}" significará que la "a" debe estar repetida 8 veces exactamente. Asimismo, usar "aaaaaaaa" es lo mismo que "a{8}". Para especificar un "almenos" deberá especificar el mínimo de repeticiones. Por ejemplo, si quiere que la "a" se repita "almenos" 8 veces, use "a{8,}".
|
||||
<p>
|
||||
Por defecto, los operadores de repetición tienden a coger la porción más larga de texto que se relacione, tantos como pueda. Por ejemplo, se tiene el texto "CARRO" y la expresión ".+R". Podría pensarse que relacionaría con "CA". Pero esto es erróneo. Puesto que tiende a coger el máximo de caracteres posible, lo haría con "CAR". Sin embargo, puede no quere este efecto. Esto puede hacerse añadiendo "?" después del operador de repetición. En el caso planteado, ".+?R", el .+? modifica el operador + para que no coja el máximo de caracteres posible. Así pues, si se usa ".+?R", relacionaría con "CA" en vez de con "CAR". El "?" puede usarse con este sentido después de cada operador de repetición: ??, *?, +?, {M,n}?.
|
||||
</div>
|
||||
|
||||
<p><font size="+2"><b>A.4 Expresiones de corchete </b></font></p>
|
||||
<div class="desc">Las expresiones de corchete aportan una manera de hacer un operador "or". Por ejemplo, si se quiere que se relacione con una "a" o con una "b", este operador se lo permitirá ([]). Por ejemplo, si se usa "[abc]" se relacionará con "a", "b" o "c". Asimismo, la expresión "a[bc]d" relacionaría con "abc" o "acd", pero no con "acc".
|
||||
<p>
|
||||
Un aspecto muy usual es hacerlo con un rango de letras o dígitos. Por ejemplo, "[012456789]" sería lo mismo que usar "[0-9]", puesto que el "-" indica un rango. Puesto que Unreal no contempla mayúsculas/minúsculas, el uso de "[a-z]" seria lo mismo que "[A-Z]". También puede incluir varios rangos en la misma expresión. Para relacionar con una letra o un dígito puede usar "[0-9a-z]". Para usar el caracter "-" como literal deberá ponerlo al final o al principio de los corchetes. Por ejemplo, "[0-9-]" relacionaría con un dígito o con -.
|
||||
<p>
|
||||
Para simplificar tareas, existen unos cuantas "clases de caracteres" que pueden usarse entre los corchetes. Esta clase de caracteres suprimen la necesidad de definir varios rangos. Las clases de caracteres se notan encerrando su nombre entre dos puntos :. Por ejemplo, "[0-9]" es lo mismo que "[:isdigit:]". Aquí tiene una lista de las clases de caracteres disponibles y su uso:
|
||||
<ul>
|
||||
<li><tt>alnum</tt> - caracteres alfanuméricos</li>
|
||||
<li><tt>alpha</tt> - caracteres alfabéticos</li>
|
||||
<li><tt>blank</tt> - caracteres blancos</li>
|
||||
<li><tt>cntrl</tt> - caracteres de control (color por ej.)</li>
|
||||
<li><tt>digit</tt> - dígitos en decimal (de 0 a 9)</li>
|
||||
<li><tt>graph</tt> - caracteres imprimibles, excepto el espacio</li>
|
||||
<li><tt>lower</tt> - caracteres minúsculos</li>
|
||||
<li><tt>print</tt> - caracteres imprimibles, incluyendo el espacio</li>
|
||||
<li><tt>punct</tt> - caracteres imprimibles, excepto el espacio y los alfanuméricos</li>
|
||||
<li><tt>space</tt> - caracteres de espacio blanco</li>
|
||||
<li><tt>upper</tt> - caracteres mayúsculos</li>
|
||||
<li><tt>xdigit</tt> - dígitos en hexadecimal</li>
|
||||
</ul>
|
||||
Cabe remarcar que estas clases de caracteres sólo pueden usarse y deben estar SOLOS entre los corchetes. Por ejemplo, "[:isdigit:-]" no sería legal. En vez de esto, puede anidar varios corchetes entre sí. Por ejemplo, en este caso se usaría "[[:isdigit:]-]".
|
||||
<p>
|
||||
La última característica de los corchetes es la negación. Algunas veces es útil imponer cualquier caracter excepto unos concretos. Por ejemplo, si quiere comprobar que no es una letra, es más cómodo especificar a-z y notar que no es uno de estos. Para ello anteponga "^" como primer caracter. Por ejemplo, "[^a-z]" relacionaría con lo que no fuera una letra. Tal y como ocurría con el -, para usar el ^ literalmente, úselo al final de la expresión, "[a-z^]". A su vez, para negar una clase de caracteres, puede hacerlo con "[^[:isdigit:]]". Recuerde que las clases de caracteres, [:blank:] por ejemplo, funcionan como una sola unidad.</p>
|
||||
</div>
|
||||
<p><font size="+2"><b>A.5 Aserciones<a name="regexassert"></a></b></font></p>
|
||||
<div class="desc">Las aserciones le permiten comprobar ciertas condiciones que no se pueden representar con cadenas de caracteres.
|
||||
<p>
|
||||
El caracter ^ se refiere al "ancho izquierdo". Este caracter relaciona con el principio de una cadena. Por ejemplo, si tan sólo usa la expresión "test" relacionaría con "esto es un test" puesto que contiene la expresión "test". En cambio, la expresión "^test" no lo haría, puesto que indicaría que DEBE empezar por "test". Análogamente, el caracter $ le indicará el ancho derecho, que debe terminar con esto. Por ejemplo, "test$" relacionaría con cualquier palabra que acabara en "test". Asimismo puede combinarlos. Por ejemplo, "^test$" relacionaría con las palabras que fueran "test" exactamente.
|
||||
<p>
|
||||
Existen varias aserciones para palabras. Todas las demás se especifican usando \ seguida del caracter en cuestión. Por ejemplo, para probar el inicio y final de una palabra, puede usar \< y \> respectivamente.
|
||||
<p>
|
||||
El resto de aserciones se definen de dos formas: positivas y negativas. Estas son:
|
||||
<ul>
|
||||
<li><tt>\b</tt> - Palabra límite
|
||||
<li><tt>\B</tt> - No palabra límite
|
||||
<li><tt>\d</tt> - Dígito (equivalente a <tt>[[:digit:]]</tt>)</li>
|
||||
<li><tt>\D</tt> - No dígito (equivalente a <tt>[^[:digit:]]</tt>)</li>
|
||||
<li><tt>\s</tt> - Espacio (equivalente a<tt>[[:space:]]</tt>)</li>
|
||||
<li><tt>\S</tt> - No espacio (equivalente a <tt>[^[:space:]]</tt>)</li>
|
||||
<li><tt>\w</tt> - Palabra (equivalente a <tt>[[:alnum:]_]</tt>)</li>
|
||||
<li><tt>\W</tt> - No palabra (equivalente a <tt>[^[:alnum:]_]</tt>)</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p><font size="+2"><b>A.6 Alternanza<a name="regexalt"></a></b></font></p>
|
||||
<div class="desc">La alternanza es un método para especificar un "or". El operador de alternanza es la barra vertical |. Por ejemplo, si quiere relacionar con "a" o "b" puede hacerlo con "a|b". Para letras normales puede reemplazarse por corchetes, pero se puede usar también para subexpresiones (a continuación).</div>
|
||||
<p><font size="+2"><b>A.7 Subexpresiones<a name="regexsub"></a></b></font></p>
|
||||
<div class="desc">Las subexpresiones son una parte de las regex que se tratan como una sola unidad. Existen dos formas de crear una subexpresión. Los dos métodos difieren en las "referencias anteriores", detalladas en el siguiente apartado. Para declarar una subexpresión que usa referencias anteriores simplemente englóbela entre paréntesis (). Para el caso contrario, reemplace el paréntesis aberito con "(?:". Por ejemplo, "([a-z])" y "(?:[a-z])". Es muy útil porque permiten tomar lo que engloban como unidades y aplicarles operadores a esta nueva expresión. Por ejemplo, si se les aplica los operadores de repetición, la repetición sería de toda la unidad, no del caracter que les precede. En el caso que tuviera que ver que un número o una letra se repite 0 o 1 vez, podría usar "([0-9a-z])?". Asimismo, imagine que tiene una secuencia de dígito-letra-dígito y quiere comprobar que se repita dos veces. Podría usar "[0-9][a-z][0-9][0-9][a-z][0-9]". Con las subexpresiones basta con "([0-9][a-z][0-9]){2}".</div>
|
||||
<p><font size="+2"><b>A.8 Referencias anteriores <a name="regexbackref"></a></b></font></p>
|
||||
<div class="desc">Las referencias anteriores le permiten referirse a una cadena que ha sido relacionada anteriormente con una de las subexpresiones de la regexp. Debe hacerlo especificando una barra invertida (\) seguida de un número, 0-9, por ejemplo\1. El uso de \0 es especial puesto que se refiere a la expresión entera y no a la subexpresión. Las referencias anteriores son útiles si quiere relacionar algo que contiene la misma cadena dos veces. Pongamos por ejemplo el caso nick!user@host y sabe que algunos troyanos que le atacan usan en su nick y user una secuencia que se relaciona con "[0-9][a-z]{5}", y que el nick y el user son los mismos. Usando "[0-9][a-z]{5}![0-9][a-z]{5}@.+" no funcionaría porque también relacionaría en caso que el nick y el user fueran distintos entre sí. Las referencias anteriores imponen esta condición. Usando "([0-9][a-z]{5})!\1@.+" funcionará exactamente como se espera. Buscaría en el nick que se relacionara con la subexpresión, entonces usaría esta referencia para especificar que el user es el mismo.
|
||||
<p>
|
||||
Puesto que sólo puede haber 9 referencias anteriores, esta es la razón de porque la notación "?:" es útil, puesto que le permite crear subexpresiones sin gastar una referencia anterior. Adicionalmente, debido a que la información de la referencia anterior no es necesario que sea gurdada, es más rápida. Gracias a esto, las subexpresiones de no-referencias anteriores deben usarse siempre que no se usen como referencia anterior.
|
||||
</div>
|
||||
<p><font size="+2"><b>A.9 Sensibilidad mayúsculas/minúsculas<a name="regexcase"></a></b></font></p>
|
||||
Tal y como se ha mencionado, Unreal no contempla las mayúsculas/minúsculas por defecto. La principal razón es que el mayor uso de las expresiones regulares es sin esta característica. Por ejemplo, si quiere bloquear el texto "www.test.com", seguramente también lo querrá con "WWW.TEST.COM". Sin embargo, puede darse el caso en el que no quiera este efecto, por ejemplo para relacionar con ciertos troyanos. Por este motivo, hay un método para activar o desactivar la insensibilidad de mayúsculas/minúsculas dinámicamente. Para desactivarla, use "(?-i)" y para activarla, "(?i)". Por ejemplo, "(?-i)[a-z](?i)[a-z]" relacionaría con letras minúsculas (insensibilidad desactivada) seguidas de letras mayúsculas/minúsculas (insensibilidad activada). Además, en vez de tener que recordar activarla cuando ha terminado, puede usarlo dentro de la subexpresión para que sólo le afecte a esta, y no a las que vengan a continuación. Por ejemplo, "(?-i:[a-z])[a-z]" es equivalente al ejemplo anterior, puesto que el "-i" sólo se aplica a la subexpresión en la que está dentro.</body>
|
||||
</html>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue