Re: Regex - Ensure 0,1 occurrences from a list of possibilities
- From: Jesse Houwing <jesse.houwing@xxxxxxxxxxxxxxxx>
- Date: Mon, 30 Mar 2009 08:06:07 +0000 (UTC)
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
On Sun, 29 Mar 2009 23:33:45 +0000 (UTC), Jesse HouwingBy 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.
<jesse.houwing@xxxxxxxxxxxxxxxx> wrote:
The following strings should pass: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.
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.
(1234|1324|1342|1423|1432|....4321)As there's only a few possibilities, you could write them out like
this:
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
.
- References:
- Prev by Date: Re: Regex - Ensure 0,1 occurrences from a list of possibilities
- Next by Date: Re: Regex - Ensure 0,1 occurrences from a list of possibilities
- Previous by thread: Re: Regex - Ensure 0,1 occurrences from a list of possibilities
- Next by thread: Re: Regex - Ensure 0,1 occurrences from a list of possibilities
- Index(es):
Relevant Pages
|