Front page | perl.golf | Postings from June 2007

## Re: regexp quickie

From:
Phil Carmody
Date:
June 27, 2007 09:54
Subject:
Re: regexp quickie
Message ID:
842085.57273.qm@web25405.mail.ukl.yahoo.com
```--- Ronald J Kimball <rjk-perl-golf@tamias.net> wrote:
> On Wed, Jun 27, 2007 at 05:45:54AM -0700, Phil Carmody wrote:
> > Say I had a string satisfying /^[A-Z_]{6}\$/, but not equal to '______'
> > and I wish to extract from that the 1 or 2 letters which are closest to
> > the n-th character in the string. Is there a simple regexp to perform
>
> Well, I wouldn't exactly call this regex simple...  But I have come up with
> one that does it:
...
> /^(?(?=.{0,\$r}[A-Z]).{0,\$r}|.*)([A-Z])(?(?<!^..{\$r}).*?([A-Z]|\$))/

> /^.{\$r}([A-Z])/ || /^.{0,\$r}([A-Z]).*?([A-Z]|\$)/ || /^.*([A-Z])/

> /^.{\$r}([A-Z])|^.{0,\$r}([A-Z]).*?([A-Z]|\$)|^.*([A-Z])/

Woh! I'm glad that's complicated, as I don't feel so bad just doing it the
naive way. (I chose the loop, rather than the joining of the result from two
substrs, one using a /^ match and the other using a \$/.)

I have another idea how to solve the problem of isolating the (1 or) 2 closest
real letters:

In the A_Z_K_ case, for n=2 (r=1), an equally useful output could be
A_Z___
That is, to replace anything beyond the first letter at or after char r with
the underscore. Two passes would be necessary, one to strip that which is
before, one to strip that which is after.

Of course, I can probably simplify things by handling the cases of when there
is and is not a letter at the point of interest separately. If there is a

It's not a big deal, I was just noodling...

Thanks for the rather heroic regexps though!
Phil

()  ASCII ribbon campaign      ()    Hopeless ribbon campaign
/\    against HTML mail        /\  against gratuitous bloodshed

[stolen with permission from Daniel B. Cristofani]

____________________________________________________________________________________
Be a better Globetrotter. Get better travel answers from someone who knows. Yahoo! Answers - Check it out.