2017-07-28 24 views
1

我是新来的正则表达式,我正在验证一个表单。我想用String.prototype.match过滤出一个不正确的数组响应。其中每个标识符总是与foo-启动,然后有7位数字javascript中的几个字符后匹配非数字

"foo-1234567" 

:输入应该匹配这种形式。如果有多个标识符,则输入格式如下:

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

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

我想匹配给我的每个标识符有foo-,然后7个字符与一个或多个非数字字符。如果输入的是这样的:

"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

匹配个别有效值的正则表达式很简单:/^foo-\d{7}$/。所以我建议在新行.split() ING然后.filter() ING扔掉不说正则表达式匹配的值:

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"))

编辑:斯宾塞的提示我已经意识到后要求的问题仅匹配以"foo-"开头并且长度正确的无效值。即,"foo-123$5^7"将在期望的输出中,但是"foo-123""xyz-1234567"将不在输出中,即使它们是无效值。如果是这样的话,你可以使用正则表达式为负前瞻与7位排除值:

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

在背景:

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"))

+0

这正则表达式是错误的,正则表达式不会为OP希望是简单:*“我想匹配给我其中有每个标识符foo-,然后7个字符1个或多个非数字字符。“*。 –

+0

@SpencerWieczorek - 我认为我的编辑涵盖了这个要求,并且没有'.split().filter()',但是我也留下了我的原始答案,以允许输出* all *无效值的情况而不仅仅是与特定格式匹配的无效值。 – nnnnnn

+0

是的,看起来不错。强制它不符合OP的要求7位数字。不幸的是,我发现有点晚了:P –

1

这可能不是最灵巧的解决方案,但你可以做一些很好的时尚蛮力位置检查非数字字符:

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

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

1

如果总是预期为\n,那么您可以这样做,否则它可能会为每个无效标识符捕获N + 12个字符,其中N是非数字字符的数量。

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

+0

它不会为2个非数字的人工作 – epascarello

相关问题