I want a regex that matches a string which contains
- At least one brace: } or {
and
- At least one digit: \d
and
- At least one instance of either: <p> or </p>
But in any order, so that all the following would be matched:
<p>{123
2}</p>
2<p>}}}
{}{}{}<p></p></p>234234}}}
And none of these would be matched:
<p>{ alphabet 123
{2}
{{{}}}
<p>1</p>
Here’s what I have so far, which demands only one of any of those components:
(<\/p>|<p>|\d|\}|\{)+
My problem is that I don’t know how to make it more general without also having to specify the order like this:
(<\/p>|<p>)+(\d)+(\}|\{)+
Or making it stupidly long to enumerate every possible order…
How can I say “Needs at least one of each of these components in any order?”
Thanks.
If your regex flavor supports lookaheads, you can use positive lookahead as:
This regex uses positive lookahead to assert that the string as atleast one of either
{or}, at least one digit and atleast one of either<p>or</p>.If you want to ensure that the string has only these and nothing else can use the regex:
which works as previous regex but also ensures that the input has no other character.
Regex implemented in Perl
The regex can be made a bit shorter as:
which makes use of the fact that
\{|\}is same as[{}],<p>|<\/p>is same as<\/?p>.