{"id":54,"date":"2013-02-11T08:05:20","date_gmt":"2013-02-11T08:05:20","guid":{"rendered":"http:\/\/www.einaweb.es\/dev\/?p=54"},"modified":"2013-02-11T11:17:34","modified_gmt":"2013-02-11T11:17:34","slug":"expresiones-regulares-describir-cadenas","status":"publish","type":"post","link":"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/","title":{"rendered":"Expresiones Regulares: describir cadenas"},"content":{"rendered":"<p>Las expresiones regulares son una forma de describir cadenas de caracteres que sirven para comparaciones y reemplazos complejos. Por ejemplo si escribimos en la l\u00ednea de comandos de windows dir *.exe, eso es una expresi\u00f3n regular que define todas las cadenas de caracteres que empiecen con cualquier cosa seguida de .exe, es decir, todos los archivos .exe. La acci\u00f3n de comparar la cadena de texto con el patr\u00f3n que le hemos dado (la expresi\u00f3n regular) se denomina reconocimiento de patrones (pattern matching).<\/p>\n<p>En Javascript las expresiones regulares se basan en las de Perl, de forma que son muy muy parecidas y se representan por el objeto RegExp (de REGular EXPresion). Para crear una expresi\u00f3n regular podemos usar el constructor del objeto RegExp, pero es mas conveniente utilizar una sintaxis especialmente pensado para ello. Veamos un ejemplo, el mas simple posible.<\/p>\n<blockquote><p>var patron = \/pato\/;<\/p><\/blockquote>\n<p>Este es el patr\u00f3n mas sencillo. En una comparaci\u00f3n con una cadena devolver\u00eda true en el caso de la cadena con la que se compara sea \u201cpato\u201d. Todos los patrones se escriben entre barras invertidas, as\u00ed como las cadenas de texto se escriben entrecomilladas. La otra forma de crear el objeto RegExp es como deciamos utilizando su constructor.<\/p>\n<blockquote><p>var patron = new RegExp(\u201cpato\u201d);<\/p><\/blockquote>\n<p>Pero en este caso lo que le pasamos al constructor es una cadena, por lo tanto en lugar de usar \/ lo entrecomillamos. Para complicar un poco mas las cosas supongamos que queremos comprobar si la cadena que nos pasan es pato, pata o pate. Entonces usariamos los corchetes, que indican opci\u00f3n, es decir, al comparar con \/[aeo]\/ devolver\u00eda cierto en caso de que la cadena fuera la letra a, la e o la letra o.<\/p>\n<blockquote><p>var patron = \/pat[aeo]\/;<\/p><\/blockquote>\n<p>\u00bfY si quisieramos comprobar si la cadena es pat0, pat1, pat2, \u2026, pat9? En lugar de tener que encerra los 10 d\u00edgitos dentro de los corchetes podemos utilizar el gui\u00f3n, que sirve para indicar rangos. Por ejemplo 0-9 ser\u00edan todos los n\u00fameros de 0 a 9 inclusive.<\/p>\n<blockquote><p>var patron = \/pat[0-9]\/;<\/p><\/blockquote>\n<p>Si quisieramos por ejemplo que el \u00faltimo caracter fuera o un d\u00edgito (0-9) o una letra min\u00fascula (a-z) simplemente se escribir\u00edan dentro de los corchetes un criterio detras de otro.<\/p>\n<blockquote><p>\/\/pat seguido de un n\u00famero o letra min\u00fascula<br \/>\nvar patron = \/pat[0-9a-z]\/;<br \/>\n\/\/ahora tambi\u00e9n puede estar seguido de una A may\u00fascula<br \/>\nvar patron2 = \/pat[0-9a-zA]\/;<\/p><\/blockquote>\n<p>\u00bfY que ocurrir\u00eda si en lugar de tener solo un n\u00famero o una letra min\u00fascula quisieramos que pudieran haber varias, pero siempre min\u00fasculas o n\u00fameros? Entonces recurrimos a +, *, ? y {}. + indica que lo que tiene a su izquierda puede estar 1 o mas veces, * indica que puede estar 0 o mas veces (en el caso de + el n\u00famero o la min\u00fascula tendr\u00eda que aparecer al menos una vez, con * pat tambi\u00e9n se aceptar\u00eda), ? indica opcionalidad, es decir, lo que tenemos a la izquierda puede o no aparecer (puede aparecer 0 o 1 veces) y por \u00faltimo {} sirve para indicar exactamente el n\u00famero de veces o que puede aparecer o un rango. Por ejemplo {3} indicar\u00eda que tiene que aparecer exactamente 3 veces, {3,8} indicar\u00eda que tiene que aparecer de 3 a 8 veces y {3,} tres veces o mas (las que sean). Hay que tener cuidado porque {} exige que se repite lo \u00faltimo, cuando no se est\u00e9 seguro de lo que va a hacer usamos (). Para ilustrar esto vamos a ver un primer ejemplo real con expresiones regulares:<\/p>\n<blockquote><p>&lt;script&gt;<br \/>\nvar patron = \/pat[ao]{2}\/;<br \/>\ndocument.write(\u201cpatopata\u201d.search(patron));<br \/>\ndocument.write(\u201cpatoa\u201d.search(patron));<br \/>\npatron = \/(pat[ao]){2}\/;<br \/>\ndocument.write(\u201cpatopata\u201d.search(patron));<br \/>\ndocument.write(\u201cpatoa\u201d.search(patron));<br \/>\n&lt;\/script&gt;<\/p><\/blockquote>\n<p>La funci\u00f3n search del tipo de objeto de String (asociado a las cadenas de caracteres) comprueba si la cadena representada por el patr\u00f3n que le pasamos como argumento se encuentra dentro de la cadena sobre la que se llama a search. En el caso de que as\u00ed sea devuelve la posici\u00f3n (por ejemplo para la cadena pato con el patron \/p\/ devolver\u00eda 0, 1 si el patr\u00f3n es a, 2 si es t,\u2026) y -1 si no se encuentra. Otra funci\u00f3n \u00fatil que merece la pena comentar es <i>cadena.replace(patron, sustituto)<\/i>, que sustituye en la cadena sobre la que se llam\u00f3 las ocurrencias del patr\u00f3n por la cadena especificada<\/p>\n<p>Si ejecutamos el programa anterior la salida por pantalla ser\u00e1 -100-1, es decir, la primera y \u00faltima llamada a search devuelven no encontrado y la segunda y las otras dos encuentran la cadena en la posici\u00f3n 0. Si nos fijamos vemos que esto es obvio. El patr\u00f3n que definimos primero, \/pat[ao]{2}\/ incluye las cadenas \u201cpataa\u201d, \u201cpatao\u201d, \u201cpatoo\u201d y \u201cpatoa\u201d, ya que lo que indica {2} que debe repetirse dos veces es [ao], no pat[ao]. Sin embargo cuando redefinimos el valor del patron utilizamos los par\u00e9ntesis de forma que {2} se aplique sobre pat[ao].<\/p>\n<p>Otro elemento interesante en las expresiones regulares es la especificaci\u00f3n de las posiciones en que se tiene que encontrar la cadena, esa es la utilidad de ^ y $, que indican que el elemento sobre el que act\u00faa debe ir al principio de la cadena o al final de esta.<\/p>\n<blockquote><p>\/\/buscamos \u201coo\u201d y que se encuentre al principio de la cadena en la que est\u00e9<br \/>\nvar patron = \/^aa\/;<br \/>\n\/\/buscamos uu al final de la cadena<br \/>\npatron = \/uu$\/;<\/p><\/blockquote>\n<p>Otros elementos a tener en cuenta son:<\/p>\n<ul>\n<li>\\d un d\u00edgito. Equivale a [0-9]<\/li>\n<li>\\D cualquier caracter que no sea un d\u00edgito.<\/li>\n<li>\\w Cualquier caracter alfanum\u00e9rico. Equivalente a [a-zA-Z0-9_].<\/li>\n<li>\\W cualquier caracter no alfanum\u00e9rico<\/li>\n<li>\\s espacio<\/li>\n<li>\\t tabulador<\/li>\n<\/ul>\n<p>Ejemplo de quitar de un html todo lo que tenga style=\u00bb*\u00bb<\/p>\n<blockquote><p>var exp = \/style=\\\u00bb([0-9a-zA-Z;:#\\s\\-])*\\\u00bb\/ig;<br \/>\nvar txto = texto.replace(exp,\u00bb \u00ab);<\/p><\/blockquote>\n<p>Para probar las expresiones tienes la siguiente url:\u00a0<a title=\"Expresiones regulares\" href=\"http:\/\/www.regextester.com\/\" target=\"_blank\">http:\/\/www.regextester.com\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las expresiones regulares son una forma de describir cadenas de caracteres que sirven para comparaciones y reemplazos complejos. Por ejemplo si escribimos en la l\u00ednea de comandos de windows dir *.exe, eso es una expresi\u00f3n regular que define todas las cadenas de caracteres que empiecen con cualquier cosa seguida de .exe, es decir, todos los [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-54","post","type-post","status-publish","format-standard","hentry","category-javascript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Expresiones Regulares: describir cadenas - Blog Desarrollador<\/title>\n<meta name=\"description\" content=\"Expresiones Regulares: describir cadenas - Blog Desarrollador\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Expresiones Regulares: describir cadenas - Blog Desarrollador\" \/>\n<meta property=\"og:description\" content=\"Expresiones Regulares: describir cadenas - Blog Desarrollador\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Desarrollador\" \/>\n<meta property=\"article:published_time\" content=\"2013-02-11T08:05:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-02-11T11:17:34+00:00\" \/>\n<meta name=\"author\" content=\"Angel Fernandez Gutierrez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@afernandezg76\" \/>\n<meta name=\"twitter:site\" content=\"@afernandezg76\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Angel Fernandez Gutierrez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/\",\"url\":\"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/\",\"name\":\"Expresiones Regulares: describir cadenas - Blog Desarrollador\",\"isPartOf\":{\"@id\":\"http:\/\/www.einaweb.es\/develop\/#website\"},\"datePublished\":\"2013-02-11T08:05:20+00:00\",\"dateModified\":\"2013-02-11T11:17:34+00:00\",\"author\":{\"@id\":\"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/2d3361868423160a6db46ce6f9fc9a3c\"},\"description\":\"Expresiones Regulares: describir cadenas - Blog Desarrollador\",\"breadcrumb\":{\"@id\":\"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"http:\/\/www.einaweb.es\/develop\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Expresiones Regulares: describir cadenas\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/#website\",\"url\":\"http:\/\/www.einaweb.es\/develop\/\",\"name\":\"Blog Desarrollador\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.einaweb.es\/develop\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/2d3361868423160a6db46ce6f9fc9a3c\",\"name\":\"Angel Fernandez Gutierrez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/366f7c75ad085d0dcc2c290559c1aa5947679d86e3a8c55db42ac1c26e16c816?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/366f7c75ad085d0dcc2c290559c1aa5947679d86e3a8c55db42ac1c26e16c816?s=96&d=mm&r=g\",\"caption\":\"Angel Fernandez Gutierrez\"},\"url\":\"http:\/\/www.einaweb.es\/develop\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Expresiones Regulares: describir cadenas - Blog Desarrollador","description":"Expresiones Regulares: describir cadenas - Blog Desarrollador","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/","og_locale":"es_ES","og_type":"article","og_title":"Expresiones Regulares: describir cadenas - Blog Desarrollador","og_description":"Expresiones Regulares: describir cadenas - Blog Desarrollador","og_url":"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/","og_site_name":"Blog Desarrollador","article_published_time":"2013-02-11T08:05:20+00:00","article_modified_time":"2013-02-11T11:17:34+00:00","author":"Angel Fernandez Gutierrez","twitter_card":"summary_large_image","twitter_creator":"@afernandezg76","twitter_site":"@afernandezg76","twitter_misc":{"Escrito por":"Angel Fernandez Gutierrez","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/","url":"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/","name":"Expresiones Regulares: describir cadenas - Blog Desarrollador","isPartOf":{"@id":"http:\/\/www.einaweb.es\/develop\/#website"},"datePublished":"2013-02-11T08:05:20+00:00","dateModified":"2013-02-11T11:17:34+00:00","author":{"@id":"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/2d3361868423160a6db46ce6f9fc9a3c"},"description":"Expresiones Regulares: describir cadenas - Blog Desarrollador","breadcrumb":{"@id":"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.einaweb.es\/develop\/expresiones-regulares-describir-cadenas\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"http:\/\/www.einaweb.es\/develop\/"},{"@type":"ListItem","position":2,"name":"Expresiones Regulares: describir cadenas"}]},{"@type":"WebSite","@id":"http:\/\/www.einaweb.es\/develop\/#website","url":"http:\/\/www.einaweb.es\/develop\/","name":"Blog Desarrollador","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.einaweb.es\/develop\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Person","@id":"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/2d3361868423160a6db46ce6f9fc9a3c","name":"Angel Fernandez Gutierrez","image":{"@type":"ImageObject","inLanguage":"es","@id":"http:\/\/www.einaweb.es\/develop\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/366f7c75ad085d0dcc2c290559c1aa5947679d86e3a8c55db42ac1c26e16c816?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/366f7c75ad085d0dcc2c290559c1aa5947679d86e3a8c55db42ac1c26e16c816?s=96&d=mm&r=g","caption":"Angel Fernandez Gutierrez"},"url":"http:\/\/www.einaweb.es\/develop\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/posts\/54","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/comments?post=54"}],"version-history":[{"count":4,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/posts\/54\/revisions"}],"predecessor-version":[{"id":57,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/posts\/54\/revisions\/57"}],"wp:attachment":[{"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/media?parent=54"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/categories?post=54"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.einaweb.es\/develop\/wp-json\/wp\/v2\/tags?post=54"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}