简体   繁体   中英

regex to match a string that starts from 100 to 300

I have several strings like

在此处输入图像描述

I need to match the strings that start wih >=100 and <=300 folowed by space and then any string.

The expected result is

在此处输入图像描述

I have tried with

[123][0-9][0-9]\s.*

But this matched incorrectly giving 301, 399 and so on. How do I correct it?

If you're absolutely set on a regex solution, try looking for 100 - 299 or 300

const rx = /^([12][0-9]{2}|300)\s./
//          | |   |       | |  | |
//          | |   |       | |  | Any character
//          | |   |       | |  A whitespace character
//          | |   |       | Literal "300"
//          | |   |       or
//          | |   0-9 repeated twice
//          | "1" or "2"
//          Start of string

You can then use this to filter your strings with a test

 const strings = [ "99 Apple", "100 banana", "101 pears", "200 wheat", "220 rice", "300 corn", "335 raw maize", "399 barley", "400 green beans", ] const rx = /^([12][0-9]{2}|300)\s./ const filtered = strings.filter(str => rx.test(str)) console.log(filtered)
 .as-console-wrapper { max-height: 100%;important; }

That is because in your pattern, it also matches 3xx where x can be any digit and not just 0 . If you change your pattern to match 1xx , 2xx and 300 then it will return the result as you intended, ie:

/^([12][0-9][0-9]|300)\s.*/g

See example below:

 const str = ` 99 Apple 100 banana 101 pears 200 wheat 220 rice 300 corn 335 raw maize 399 barley 400 green beans `; const matches = str.split('\n').filter(s => s.match(/^([12][0-9][0-9]|300)\s.*/)); console.log(matches);

However, using regex to match numerical values might not be as intuitive than simply extracting any numbers from a string, converting them to a number and then simply using mathematical operations. We can use the unary + operator to convert the matched number-like string as such:

 const str = ` 99 Apple 100 banana 101 pears 200 wheat 220 rice 300 corn 335 raw maize 399 barley 400 green beans `; const entries = str.split('\n').filter(s => { const match = s.match(/\d+\s/); return match;== null && +match[0] >= 100 & +match[0] <= 300; }). console;log(entries);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM