Mahajan344
Mahajan344

Reputation: 2550

Need regex expression with multiple conditions

I need regex with following conditions

I have tried following but its not, its not fulfilling all conditions

@"^([\-\+]?)\d{0,5}(.[0-9]{1,3})?)$"

E.g. maximum value can hold is from -99999.999 to 99999.999

Upvotes: 1

Views: 148

Answers (3)

Tim Biegeleisen
Tim Biegeleisen

Reputation: 520878

Use this regex:

^[-+]?\d{0,5}(\.[0-9]{1,3})?$

I only made two changes here. First, you don't need to escape any characters inside a character class normally, except for opening and closing brackets, or possibly backslash itself. Hence, we can use [-+] to capture an initial plus or minus. Second, you need to escape the dot in your regex, to tell the engine that you want to match a literal dot.

However, I would probably phrase this regex as follows:

^[-+]?\d{1,5}(\.[0-9]{1,3})?$

This will match one to five digits, followed by an optional decimal point, followed by one to three digits.

Note that we want to capture things like:

0.123

But not

.123

i.e. we don't want to capture a leading decimal point should it not be prefixed by at least one number.

Demo here:

Regex101

Upvotes: 1

user207421
user207421

Reputation: 310840

It should accept maximum of 5 digits

[0-9]{1,5}

then upto 3 decimal places

 [0-9]{1,5}(\.[0-9]{1,3})?

it can be negative

 [-]?[0-9]{1,5}(\.[0-9]{1,3})?

it can be zero

Already covered.

it can be only numbers (max. upto 5 digit place)

Already covered. 'Up to 5 digit place' contradicts your first rule, which allows 5.3.

it can be null

Not covered. I strongly suggest you remove this requirement. Even if you mean 'empty', as I sincerely hope you do, you should detect that case separately and beforehand, as you will certainly have to handle it differently.

Your regular expression contains ^ and $. I don't know why. There is nothing about start of line or end of line in the rules you specified. It also allows a leading +, which again isn't specified in your rules.

Upvotes: 0

mroach
mroach

Reputation: 2468

I assume you're doing this in C# given the notation. Here's a little code you can use to test your expression, with two corrections:

  1. You have to escape the dot, otherwise it means "any character". So, \. instead of .
  2. There was an extraneous close parenthesis that prevented the expression from compiling

C#:

var expr = @"^([\-\+]?)\d{0,5}(\.[0-9]{1,3})?$";
var re = new Regex(expr);
string[] samples = {
    "",
    "0",
    "1.1",
    "1.12",
    "1.123",
    "12.3",
    "12.34",
    "12.345",
    "123.4",
    "12345.123",
    ".1",
    ".1234"
};
foreach(var s in samples) {
    Console.WriteLine("Testing [{0}]: {1}", s, re.IsMatch(s) ? "PASS" : "FAIL");
}

Results:

Testing []: PASS
Testing [0]: PASS
Testing [1.1]: PASS
Testing [1.12]: PASS
Testing [1.123]: PASS
Testing [12.3]: PASS
Testing [12.34]: PASS
Testing [12.345]: PASS
Testing [123.4]: PASS
Testing [12345.123]: PASS
Testing [.1]: PASS
Testing [.1234]: FAIL

Upvotes: 0

Related Questions