Letâs say we have a string like +7(903)-123-45-67 and want to find all numbers in it. But unlike before, we are interested not in single digits, but full numbers: 7, 903, 123, 45, 67.
A number is a sequence of 1 or more digits \d. To mark how many we need, we can append a quantifier.
Quantity {n}
The simplest quantifier is a number in curly braces: {n}.
A quantifier is appended to a character (or a character class, or a [...] set etc) and specifies how many we need.
It has a few advanced forms, letâs see examples:
- The exact count:
{5} -
\d{5}denotes exactly 5 digits, the same as\d\d\d\d\d.The example below looks for a 5-digit number:
alert( "I'm 12345 years old".match(/\d{5}/) ); // "12345"We can add
\bto exclude longer numbers:\b\d{5}\b. - The range:
{3,5}, match 3-5 times -
To find numbers from 3 to 5 digits we can put the limits into curly braces:
\d{3,5}alert( "I'm not 12, but 1234 years old".match(/\d{3,5}/) ); // "1234"We can omit the upper limit.
Then a regexp
\d{3,}looks for sequences of digits of length3or more:alert( "I'm not 12, but 345678 years old".match(/\d{3,}/) ); // "345678"
Letâs return to the string +7(903)-123-45-67.
A number is a sequence of one or more digits in a row. So the regexp is \d{1,}:
let str = "+7(903)-123-45-67";
let numbers = str.match(/\d{1,}/g);
alert(numbers); // 7,903,123,45,67
Shorthands
There are shorthands for most used quantifiers:
+-
Means âone or moreâ, the same as
{1,}.For instance,
\d+looks for numbers:let str = "+7(903)-123-45-67"; alert( str.match(/\d+/g) ); // 7,903,123,45,67 ?-
Means âzero or oneâ, the same as
{0,1}. In other words, it makes the symbol optional.For instance, the pattern
ou?rlooks forofollowed by zero or oneu, and thenr.So,
colou?rfinds bothcolorandcolour:let str = "Should I write color or colour?"; alert( str.match(/colou?r/g) ); // color, colour *-
Means âzero or moreâ, the same as
{0,}. That is, the character may repeat any times or be absent.For example,
\d0*looks for a digit followed by any number of zeroes (may be many or none):alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1Compare it with
+(one or more):alert( "100 10 1".match(/\d0+/g) ); // 100, 10 // 1 not matched, as 0+ requires at least one zero
More examples
Quantifiers are used very often. They serve as the main âbuilding blockâ of complex regular expressions, so letâs see more examples.
Regexp for decimal fractions (a number with a floating point): \d+\.\d+
In action:
alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345
Regexp for an âopening HTML-tag without attributesâ, such as <span> or <p>.
-
The simplest one:
/<[a-z]+>/ialert( "<body> ... </body>".match(/<[a-z]+>/gi) ); // <body>The regexp looks for character
'<'followed by one or more Latin letters, and then'>'. -
Improved:
/<[a-z][a-z0-9]*>/iAccording to the standard, HTML tag name may have a digit at any position except the first one, like
<h1>.alert( "<h1>Hi!</h1>".match(/<[a-z][a-z0-9]*>/gi) ); // <h1>
Regexp âopening or closing HTML-tag without attributesâ: /<\/?[a-z][a-z0-9]*>/i
We added an optional slash /? near the beginning of the pattern. Had to escape it with a backslash, otherwise JavaScript would think it is the pattern end.
alert( "<h1>Hi!</h1>".match(/<\/?[a-z][a-z0-9]*>/gi) ); // <h1>, </h1>
We can see one common rule in these examples: the more precise is the regular expression â the longer and more complex it is.
For instance, for HTML tags we could use a simpler regexp: <\w+>. But as HTML has stricter restrictions for a tag name, <[a-z][a-z0-9]*> is more reliable.
Can we use <\w+> or we need <[a-z][a-z0-9]*>?
In real life both variants are acceptable. Depends on how tolerant we can be to âextraâ matches and whether itâs difficult or not to remove them from the result by other means.
komentar
<code>, untuk beberapa baris â bungkus dengan tag<pre>, untuk lebih dari 10 baris â gunakan sandbox (plnkr, jsbin, < a href='http://codepen.io'>codepenâ¦)