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

使用javascript在几个字符后匹配非数字,javascript,regex,Javascript,Regex,我不熟悉正则表达式,正在验证一个表单。我想使用String.prototype.match将不正确的响应过滤到数组中。输入应与此表单匹配: "foo-1234567" "foo-1234567\nfoo-7654321\nfoo-1324536"` 其中每个标识符始终以foo-开头,然后有7位数字。如果有多个标识符,则输入采用以下形式: "foo-1234567" "foo-1234567\nfoo-7654321\nfoo-1324536"` 其中标识符由换行符分隔 我希望match为

我不熟悉正则表达式,正在验证一个表单。我想使用
String.prototype.match
将不正确的响应过滤到数组中。输入应与此表单匹配:

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

"foo-1234567"
"foo-1234567\nfoo-7654321\nfoo-1324536"`
其中标识符由换行符分隔

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

"foo-1234567\nfoo-1234A67\nfoo-123$5^7"
我想要一个来自
匹配的数组,如下所示:
[“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
/^foo-\D+$/gmi//nada
/^foo-(\D){1,7}$/gmi//甚至不接近
/^foo-\d*\d+\d*$/gmi//良好,但匹配>或<7个字符
/^foo-(?=^foo-\d*\d+\d*$)(?=PR-.{7})/gmi//空字符串或null

一如既往,这是代码高尔夫,因此最短代码获胜。

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

let getInvalid=input=>input.split(“\n”).filter(v=>!/^foo-\d{7}$/.test(v))
//以下内容包含所有有效内容,因此输出空数组:
console.log(getInvalid(“foo-1234567\nfoo-7654321\nfoo-1324536”))
//以下部分无效,因此将其输出:
console.log(getInvalid(“foo-1234567\nfoo-1234A67\nxyz-1234567\nfoo-123$5^7”))
//当只有一个值时也有效:
console.log(getInvalid(“foo-1234567”))
//以下部分无效,因此将其输出:

log(getInvalid(“foo-123$5^7”)
匹配单个有效值的正则表达式很简单:
/^foo-\d{7}$/
。因此,我建议在换行符上使用
.split()
ing,然后使用
.filter()
ing来丢弃与该正则表达式不匹配的值:

let getInvalid=input=>input.split(“\n”).filter(v=>!/^foo-\d{7}$/.test(v))
//以下内容包含所有有效内容,因此输出空数组:
console.log(getInvalid(“foo-1234567\nfoo-7654321\nfoo-1324536”))
//以下部分无效,因此将其输出:
console.log(getInvalid(“foo-1234567\nfoo-1234A67\nxyz-1234567\nfoo-123$5^7”))
//当只有一个值时也有效:
console.log(getInvalid(“foo-1234567”))
//以下部分无效,因此将其输出:

console.log(getInvalid(“foo-123$5^7”))
这可能不是最巧妙的解决方案,但您可以对非数字字符执行一些良好的o'l fashion暴力位置检查:

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

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

这可能不是最巧妙的解决方案,但您可以对非数字字符执行一些良好的o'l fashion暴力位置检查:

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

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

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


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

如果总是期望
\n
,则可以这样做,否则它可能会为每个无效标识符捕获n+12个字符,其中n是非数字字符数


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

正则表达式是错误的,正则表达式不会像OP希望的那样简单:“我希望匹配给我每个有foo的标识符,然后是7个字符和1个或多个非数字字符。”@SpencerWieczorek-我认为我的编辑满足了这个要求,并且没有
.split().filter()
,但我也保留了我的原始答案,以允许所有无效值都应该在输出中,而不仅仅是匹配特定格式的无效值。强制它与7位数字不匹配符合OP的要求。不幸的是,我发现有点晚了:我确实在寻找你的第二个答案(这样我可以避免
split
ting和
filter
ing)。聪明的正则表达式是错误的,正则表达式不会像OP希望的那样简单:“我希望match给我每个标识符都有foo,然后是7个字符和1个或多个非数字字符。”@SpencerWieczorek-我想我的编辑涵盖了这个要求,并且没有
.split().filter()
,但我也保留了我的原始答案,以允许所有无效值都应该在输出中,而不仅仅是匹配特定格式的无效值。强制它与7位数字不匹配符合OP的要求。不幸的是,我发现有点晚了:我确实在寻找你的第二个答案(这样我可以避免
split
ting和
filter
ing)。聪明的它不适用于有2个非数字的,它不适用于有2个非数字的