156
votes

I'm trying to parse a document that has reference numbers littered throughout it.

Text text text {4:2} more incredible text {4:3} much later on {222:115} and yet some more text.

The references will always be wrapped in brackets, and there will always be a colon between the two. I wrote an expression to find them.

{[0-9]:[0-9]}

However, this obviously fails the moment you come across a two or three digit number, and I'm having trouble figuring out what that should be. There won't ever be more than 3 digits {999:999} is the maximum size to deal with.

Anybody have an idea of a proper expression for handling this?

4
Even if the OP doesn't care, I'm curious: Why the downvote on this question? I don't see a thing wrong with it.John
@John: For some reason people like to downvote questions where there are easy answers, especially in the regex tag.CanSpice
In the end this question got a higher rank on google and I found my answer in this one.Jasonfish

4 Answers

154
votes
{[0-9]+:[0-9]+}

try adding plus(es)

82
votes

What regex engine are you using? Most of them will support the following expression:

\{\d+:\d+\}

The \d is actually shorthand for [0-9], but the important part is the addition of + which means "one or more".

38
votes

Try this:

{[0-9]{1,3}:[0-9]{1,3}}

The {1,3} means "match between 1 and 3 of the preceding characters".

8
votes

You can specify how many times you want the previous item to match by using {min,max}.

{[0-9]{1,3}:[0-9]{1,3}}

Also, you can use \d for digits instead of [0-9] for most regex flavors:

{\d{1,3}:\d{1,3}}

You may also want to consider escaping the outer { and }, just to make it clear that they are not part of a repetition definition.