使用javascript匹配几个字符后的非数字

时间:2017-07-28 02:30:20

标签: javascript regex

我是正则表达的新手,我正在验证表单。我想使用String.prototype.match过滤掉不正确的数组响应。输入应与此格式匹配:

"foo-1234567"

其中每个标识符始终以foo-开头,然后有7位数字。如果有多个标识符,则输入采用以下形式:

"foo-1234567\nfoo-7654321\nfoo-1324536"`

其中标识符由换行符分隔。

我希望匹配为每个标识符提供foo-,然后是7个字符,包含1个或多个非数字字符。如果输入是这样的:

"foo-1234567\nfoo-1234A67\nfoo-123$5^7"

我想要match这样的数组:["foo-1234A67", "foo-123$5^7"]

我试过的正则表达式:

/^foo-\D+$/gmi   //nada
/^foo-(\D){1,7}$/gmi    //not even close
/^foo-\d*\D+\d*$/gmi    //good but matches > or < 7 characters
/^foo-(?=^foo-\d*\D+\d*$)(?=PR-.{7})/gmi    //empty string or null

与往常一样,这是代码高尔夫,所以最短的代码获胜。

3 个答案:

答案 0 :(得分:3)

匹配单个有效值的正则表达式很简单:/^foo-\d{7}$/。因此,我建议.split()使用新行,然后.filter()抛弃与该正则表达式不匹配的值:

&#13;
&#13;
let getInvalid = input => input.split("\n").filter(v => !/^foo-\d{7}$/.test(v))

// following has all valid, so outputs empty array:
console.log( getInvalid("foo-1234567\nfoo-7654321\nfoo-1324536") )
// following has some invalid, so outputs them:
console.log( getInvalid("foo-1234567\nfoo-1234A67\nxyz-1234567\nfoo-123$5^7") )
// also works when there is only one value:
console.log( getInvalid("foo-1234567") )
// following has some invalid, so outputs them:
console.log( getInvalid("foo-123$5^7") )
&#13;
&#13;
&#13;

编辑:在Spencer的提示之后,我意识到要求的问题只是匹配以"foo-"开头并且长度合适的无效值。即,"foo-123$5^7"将在所需的输出中,但"foo-123""xyz-1234567"将不在输出中,即使它们是无效值。如果是这种情况,您可以使用具有负前瞻的正则表达式来排除7位数的值:

/^foo-(?!\d{7}).{7}$/

在上下文中:

&#13;
&#13;
let getInvalid = input => input.match(/^foo-(?!\d{7}).{7}$/gmi)

console.log( getInvalid("foo-1234567\nfoo-1234A67\nfoo-123") )
console.log( getInvalid("foo-1234567\nfoo-11111117\nfoo-1239999") )
console.log( getInvalid("foo-12##567\nxyz-1234A67\nfoo-123$5^7") )
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这可能不是最简单的解决方案,但你可以为非数字字符做一些好的时尚暴力位置检查:

/^foo\-(\D......|.\D.....|..\D....|...\D...|....\D..|.....\D.|......\D)$/gm

如果我找到更好的方法来检查“1个或更多非数字”要求,我会给出更新。

答案 2 :(得分:1)

如果始终需要\n,则可以执行此类操作,否则每个无效标识符可能会捕获N + 12个字符,其中N是非数字字符的数量。

/foo-\d{0,6}\D+\d{0,6}/g