正则表达式用于匹配仅由字母列表构成的单词

时间:2019-05-07 17:35:17

标签: javascript regex regex-lookarounds regex-group regex-greedy

给出一组单词,我需要知道哪些单词仅由一组字母组成。即使该字母是验证集的一部分,该单词的字母也不能超过允许的数量。

示例:

Char set: a, a, ã, c, e, l, m, m, m, o, o, o, o, t (fixed set)

Words set: mom, ace, to, toooo, ten, all, aaa (variable set)

结果:

mom = true
ace = true
to = true
toooo = true
ten = false (n is not in the set)
all = false (there is only 1 L in the set)
aaa = false (theres is only 2 A in the set)

如何在Javascript中生成此正则表达式? (区分大小写不是问题)。

我尝试了以下代码,但没有成功:

var str = "ten"
var patt = new RegExp("^[a, a, ã, c, e, l, m, m, m, o, o, o, o, t]*");
console.log(patt.test(str));

1 个答案:

答案 0 :(得分:5)

尽管我认为此任务更适合通过编写一些代码而不使用正则表达式来完成。但是我认为应该可行的一种方法是使用负面的前瞻。

让我们以您的字符集为例,您所允许的单词可以跟在字母后面,并且不超过列表中显示的数量。

a, a, ã, c, e, l, m, m, m, o, o, o, o, t

我们可以编写以下正则表达式,使用负前瞻来丢弃包含的字符数超过每个字符上面设置所允许的字符数的字符串,最后使用1到N个允许的字符集捕获单词,其中N为总字符数。

^(?!([^a]*a){3})(?!([^ã]*ã){2})(?!([^c]*c){2})(?!([^e]*e){2})(?!([^l]*l){2})(?!([^m]*m){4})(?!([^o]*o){5})(?!([^t]*t){2})[aãcelmot]{1,14}$

说明:

  • ^-字符串的开头
  • (?!([^a]*a){3})-如果字符串中a的数目为3或更多,因为集合中a的总数仅为2,则此否定超前行为将拒绝输入。
  • (?!([^ã]*ã){2})-同样,如果字符串中ã的数目等于或大于2,因为设置的ã的总数仅为1,则该否定超前查询将拒绝输入。
  • 所有字符等等
  • [aãcelmot]{1,14}-此字符集捕获允许的字符至少一个到最大14,尽管我们也可以简单地编写+,因为已经使用否定的前瞻检查了允许的最大字符数。 / li>
  • $-字符串结尾

JS代码演示

const arr = ['mom','ace','to','toooo','ten','all','aaa']

arr.forEach(x => console.log(x + " --> " +/^(?!([^a]*a){3})(?!([^ã]*ã){2})(?!([^c]*c){2})(?!([^e]*e){2})(?!([^l]*l){2})(?!([^m]*m){4})(?!([^o]*o){5})(?!([^t]*t){2})[aãcelmot]{1,14}$/.test(x)))