user2863323
user2863323

Reputation: 351

How to make a regular expression that matches tokens with delimiters and separators?

I want to be able to write a regular expression in java that will ensure the following pattern is matched.

<D-05-hello-87->

For the letter D, this can either my 'D' or 'E' in capital letters and only either of these letters once.

The two numbers you see must always be a 2 digit decimal number, not 1 or 3 numbers.

The string must start and end with '<' and '>' and contain '-' to seperate parts within.

The message in the middle 'hello' can be any character but must not be more than 99 characters in length. It can contain white spaces.

Also this pattern will be repeated, so the expression needs to recognise the different individual patterns within a logn string of these pattersn and ensure they follow this pattern structure. E.g

So far I have tried this:

([<](D|E)[-]([0-9]{2})[-](.*)[-]([0-9]{2})[>]\z)+

But the problem is (.*) which sees anything after it as part of any character match and ignores the rest of the pattern.

How might this be done? (Using Java reg ex syntax)

Upvotes: 1

Views: 590

Answers (3)

anubhava
anubhava

Reputation: 785038

Try making it non-greedy or negation:

(<([DE])-([0-9]{2})-(.*?)-([0-9]{2})>)

Live Demo: http://ideone.com/nOi9V3

Upvotes: 2

Martijn Courteaux
Martijn Courteaux

Reputation: 68847

Update: tested and working

<([DE])-(\d{2})-(.{1,99}?)-(\d{2})>

See it working: http://rubular.com/r/6Ozf0SR8Cd

You should not wrap -, < and > in [ ]

Upvotes: 1

Explosion Pills
Explosion Pills

Reputation: 191729

Assuming that you want to stop at the first dash, you could use [^-]* instead of .*. This will match all non-dash characters.

Upvotes: 0

Related Questions