我是正则表达的新手,我正在验证表单。我想使用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
与往常一样,这是代码高尔夫,所以最短的代码获胜。
答案 0 :(得分:3)
匹配单个有效值的正则表达式很简单:/^foo-\d{7}$/
。因此,我建议.split()
使用新行,然后.filter()
抛弃与该正则表达式不匹配的值:
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;
编辑:在Spencer的提示之后,我意识到要求的问题只是匹配以"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") )
&#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