Article View: es.comp.os.linux.programacion
Article #586Re: Ayuda con expresiones regulares
From: Pascal Bourguignon
Date: Fri, 06 Apr 2007 12:07
Date: Fri, 06 Apr 2007 12:07
75 lines
3483 bytes
3483 bytes
"F" <esnewsfQuItAeStO@EsToCaMbIeNyahoo.es> writes:
> Hola,
>
> Tengo una cadena con las siguientes caracteristicas
>
> -El numero de caracteres siempre tiene que ser 7
> -puede tener alfanumericos y espacios, pero todos los alfanumericos que
> tengan tienen que estar al principio y todos lo espacios al final ( es decir
> no se pueden intercarlar).
>
> Puede resolver estas dos condiciones por separado, pero no he conseguido
> resolverlo juntas
>
> ๏ฟฝalguien me puede echar una mano?
Muy a menudo, se puede hacer mas facilmente una expresion regular
inversa, or usar varias expresiones regulares.
Por ejemplo, el lenguaje que quieres reconocer es la intersecsion de
/^.......$/ y /^[A-Za-z0-9]* *$/
Lo mas simple, en un programa, seria de comprobar las dos expresiones.
(if (and (= 7 (length string)) (regexp-match "^[A-Za-z0-9]* *$" string))
(got-it)
(not-a-word))
Si quieres construir una expresion regular sola, es posible, pero a
menudo eso da expresiones muy largas, porque el lenguaje de las
expresiones regulares es muy rudimentario.
;; adaptar estas re- funciones de acuerdo con la syntax de regexp usada...
(defun re-sequence (&rest args)
(apply (function concatenate) 'string args))
(defun re-repeat (re times)
(case times
((0) "")
((1) re)
(otherwise (format nil "\\(~A\\){~D}" re times))))
(defun re-alternate (&rest alternatives)
(format nil "\\(~{~A~^\\|~}" alternatives))
(defun build-my-re (n)
(re-sequence
"^\\("
(apply (function re-alternate)
(loop for i from 0 to n
collect (re-sequence (re-repeat "[A-Za-z0-9]" i)
(re-repeat " " (- n i)))))
"\\)$"))
(build-my-re 7)
--> "^\\(\\(\\( \\){7}\\|[A-Za-z0-9]\\( \\){6}\\|\\([A-Za-z0-9]\\){2}\\( \\){5}\\|\\([A-Za-z0-9]\\){3}\\( \\){4}\\|\\([A-Za-z0-9]\\){4}\\( \\){3}\\|\\([A-Za-z0-9]\\){5}\\( \\){2}\\|\\([A-Za-z0-9]\\){6} \\|\\([A-Za-z0-9]\\){7}\\)$"
> cadenas validos serian
>
> "a "
> "asd "
> " "
> "xxxxxxx"
>
> he invalidas
> "a s "
> " "
> "asas"
--
__Pascal Bourguignon__
http://www.informatimago.com
http://pjb.ogamita.org
Technical Details
Message-ID:
<87hcrtpuyi.fsf@voyager.informatimago.com>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mailReferences:
<fA7Rh.3556107$D7.6476545@telenews.teleline.es>Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,dd1337191e711daf
X-Google-Attributes: gidf86c8,public
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: Pascal Bourguignon <pjb@informatimago.com>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Ayuda con expresiones regulares
Date: Fri, 06 Apr 2007 14:07:33 +0200
Organization: Informatimago
Lines: 75
Message-ID: <87hcrtpuyi.fsf@voyager.informatimago.com>
References: <fA7Rh.3556107$D7.6476545@telenews.teleline.es>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: individual.net KJ6rmyTjNVF/sqcndq6axQm+jSqc1+CbJwz3t1TglyGk5MZSso
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA
oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9
033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac
l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR
mV+hO/VvFAAAAABJRU5ErkJggg==
X-Accept-Language: fr, es, en
X-Disabled: X-No-Archive: no
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.94 (gnu/linux)
Cancel-Lock: sha1:UIw6dwpbryTCs4Wyf/iC6FjJj7k=