spots
spots

Reputation: 2708

Javascript Regex Object Doesn't Recognize {n,m}

I'm trying to write a regular expression in JS to recognize any digit up to seven times, followed by a "-" followed by 2 digits followed by "-" followed by a single digit. This is the simple regex I have:

/\d{1,7}-\d{2}-\d/g

This should match strings like:

but not 12345678-12-1

However, the above is returning true. The regex returns true when there is any number of digit in the first group.

Does the JavaScript Regex object not support {n,m}?

Here is an example of what I am talking about.

var pattern = new RegExp(/\d{1,7}-\d{2}-\d/);
alert(pattern.test("12345678-13-1"));

http://jsfiddle.net/XTRAc/1/ live example

Upvotes: 0

Views: 290

Answers (5)

Ωmega
Ωmega

Reputation: 43683

If you need to validate entire input string, use regex pattern

/^\d{1,7}-\d{2}-\d$/

If you need to validate entire line of input string, use regex pattern

/^\d{1,7}-\d{2}-\d$/mg

If you need to find matches within input string, use regex pattern

/(?:\D|^)(\d{1,7}-\d{2}-\d)(?!\d)/g

...and use $1 as a result.

Upvotes: 1

Bergi
Bergi

Reputation: 665030

It does support the {min,max}-syntax, but .match and .test() try to find matching substrings. You will have to include start and end anchors. Also notice that you should either use the RegExp constructor to build a regex from a string or a regex literal, but not both (see MDN: creating regexes).

/^\d{1,7}-\d{2}-\d$/
new RegExp("^\\d{1,7}-\\d{2}-\\d$") // the worse choice

Upvotes: 4

Martin Ender
Martin Ender

Reputation: 44279

It matches 2345678-13-1. You need to anchor it to the beginning and end of your string:

/^\d{1,7}-\d{2}-\d$/

Note though, that (as Rocket Hazmat pointed out) you do not need to use the RegExp constructor if you use a regex literal (something without string quotes).

JSFiddle

Upvotes: 6

andrux
andrux

Reputation: 2922

It does support the {n,m} part, the problem here is that your example matches 2345678, so you would need a way of matching the character before the first set of digits

Upvotes: 0

user1726343
user1726343

Reputation:

You are constructing your regex incorrectly. Try this (note the anchors, which ensure the string consists of nothing but your pattern):

var pattern= /^\d{1,7}-\d{2}-\d$/;

Otherwise subsets of the existing string will match your regex.

Upvotes: 1

Related Questions