develooper Front page | | Postings from June 2007

Re: regexp quickie

Thread Previous
Phil Carmody
June 27, 2007 09:54
Re: regexp quickie
Message ID:
--- Ronald J Kimball <> 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
> > that task?
> 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
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
letter there, the answer is already found.

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

Thanks for the rather heroic regexps though!

()  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.

Thread Previous Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About