Re: Regex - Ensure 0,1 occurrences from a list of possibilities

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



Hello Jesse,

Hello Mark,

There are only 64 permutations. Not a pretty regex though:

"D-(1234|1243|1324|1342|1423|1432|2134|2143|2314|2341|2413|2431|
3124|3142|3214|3241|3412|3421|4123|4132|4213|4231|4312|4321|123|
124|132|134|142|143|213|214|231|234|241|243|312|314|321|324|341|342|
412|413|421|423|431|432|12|13|14|21|23|24|31|32|34|41|42|43|1|2|3|4)$"

You could make that much shorter by making permutations like
([1234]|1[234]|2[134]... etc, whould make it even shorter. There's
even tools for that, but I can't find them right now. Used to use them
to generate regex's for SpamAssassin.

But I agree... not very pretty.

I had some thinking and came up with this regex:

^D-(?:(?(1)(?!(?(1)))|(?<1>1))|(?(2)(?!(?(2)))|(?<2>2))|(?(3)(?!(?(3)))|(?<3>3))|(?(4)(?!(?(4)))|(?<4>4))){1,4}$

it works a lot like the regex by invegat. But it is more generic. It would be pretty easy to extend this or generate this for longer strings. Evwen though a simple piece of C# would be more elegant, I couldn't resist trying to see if it was possible with just Regex :)

Basically it does this:

(?(1) checks to see if we've already matched a 1
(?!(?(1)) creates a no-match if that was the case
|(?<1>1) matches a 1 (and due to the constructs before, only if we hadn't matched one before)

Now or this together with the same construct for 2,3 and 4 and you can use {1,4} to specify the range.

Jesse



Jesse

-Mark

<nospam@invegat> wrote in message
news:vb20t4pe3tgjj7gm8igql0dcl9ec36e52p@xxxxxxxxxx

By my calculation there are 504 possibilities, I wouldn't call that
"only a few". If I were doing it these way I would generate the
matching strings with a 1 time use program.

On Sun, 29 Mar 2009 23:33:45 +0000 (UTC), Jesse Houwing
<jesse.houwing@xxxxxxxxxxxxxxxx> wrote:

Hello Byron,

I'm looking for an expression that checks that within a string
only certain characters appear, and that they appear at most 1
time. For example, a string can have up to 4 unique digits between
1 and 4.

The following strings should pass:
D-1
D-14
D-1234
D-41
The following should fail:
D- (no digit)
D-0 (out of range)
D-5 (out of range)
D-11 (repeated digit)
D-1 2 (embedded space)
D-12345 (out of range and too long)
The expression "D-[1234]{1,4}" comes close, but it matches even
when a
digit is repeated within the string.
Any help would be greatly appreciated.
As there's only a few possibilities, you could write them out like
this:

(1234|1324|1342|1423|1432|....4321)

And do the same with the other options.

A better wat woukd be to check the general format with a regex, and
then later (if you're using asp.net validators) check the other
requirement.

There are other possibilities (as invegat pointed out), but those
aren't
supported by clientside Javascript , which would require a
serverside
check
anyway.
--
Jesse Houwing
jesse.houwing at sogeti.nl
Posted by JetBrains Omea Pro 1098.1

--
Jesse Houwing
jesse.houwing at sogeti.nl


.



Relevant Pages

  • Re: Regex - Ensure 0,1 occurrences from a list of possibilities
    ... matching strings with a 1 time use program. ... D-11 (repeated digit) ... A better wat woukd be to check the general format with a regex, ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Java vs. Pascal
    ... Strings zu tun. ... 500 pattern.split~Regex ... Mit wiederverwendetem pattern hat man da schon 30% der Zeit gespart. ... Das Potential der verschiedenen Methoden (RegEx, StringTokenizer, split2) ...
    (de.comp.lang.java)
  • Re: How to convert a number to hex number?
    ... Originally two's compliment representations were used to efficiently ... the same could be said for any ascii representation of numbers. ... The idea of base-complement is that the first digit is the zero digit for ... Also I wanted to see how much slower using strings instead of ints would be. ...
    (comp.lang.python)
  • Re: infinity
    ... >> TO asserts a priori that there are as 'many' digit positions in any ... >> one of his strings as there are arbitrary binary strings in his set ... That may be true in the twilight zone of TOmatics, ... >>> Not clear to anyone outside of Virgilogic, ...
    (sci.math)
  • Regex doesnt match - what am I doing wrong?
    ... I am having trouble matching a regex that combines a negated character ... This matched all strings regardless of whether or not they ended in a ...
    (comp.lang.perl.misc)