如何用数字,日期和月份验证字符串?

时间:2019-05-28 00:54:27

标签: regex string validation regex-group regex-greedy

什么是验证以下字符串的正确正则表达式:

id

以上将是字段中允许的输入值。

2 个答案:

答案 0 :(得分:3)

  

使用正则表达式进行验证非常困难。

我们可以从类似于以下内容的表达式开始

[0-9]+\s+(days?|months?)

并为其添加更多边界。例如,我们可以添加开始和结束字符:

^[0-9]+\s+(days?|months?)$

或者我们可以缩小界限。例如,如果MOnths和其他空格都可以,我们可以添加一个i标志和\s+

DEMO


如果我们希望传递一定数量的数字(例如1到2),则可以添加量词边界:

^[0-9]{1,2}\s(days?|months?)$

DEMO

或者我们可以分别为日和月使用两个规则,并将它们与逻辑或连接:

^([0-9]{1,3}\sdays?|[0-9]{1,2}\smonths?)$

DEMO


准确性

根据Allan的建议,如果需要,我们还可以在表达式中包含单数和复数约束,并扩展验证:

^[01]\s+(?:day|month)$|^[2-9]\s+(?:days|months)$|^[1-9]+[0-9]+\s+(?:days|months)$

DEMO

RegEx电路

jex.im可视化正则表达式:

enter image description here

测试

const regex = /^([0-9]{1,3}\sdays?|[0-9]{1,2}\smonths?)$/gmi;
const str = `100 day
300 days
11 month
22 months
20 months
12   months
1211111   MonTHs`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

答案 1 :(得分:2)

这里是一种仅将天数/月数和附带的关键字作为单独的组进行获取的方法:

([0-9]+) ((days|day|months|month))

通过这种方式,您可以通过引用正确的组来访问数字或关键字。

Demo