使用正则表达式匹配仅由字母列表中的字母组成的单词

4

给定一组单词,我需要知道哪些单词仅由一组字母组成。这个单词不能有比允许的字母更多,即使该字母是验证集的一部分。

例如:

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

4
这不是代码编写服务。请展示一下你已经完成的内容。然后也许我们可以帮助修复那段代码。 - A Rogue Otaku
我在我的帖子中编辑了代码。 - Eduardo Arruda Pimentel
1
@G.aziz,是的。如果有5个O,这将是tooooo = true,但是toooooo = false。 - Eduardo Arruda Pimentel
2
我认为这个问题不能使用正则表达式来解决。正则表达式是一种没有记忆的有限状态机,因此无法记住在序列中匹配一个字符的次数。 - Neb
@Thefourthbird,我不需要使用正则表达式,但我的单词集很大。因此,我决定使用正则表达式而不是循环。 - Eduardo Arruda Pimentel
显示剩余4条评论
1个回答

4

虽然我觉得编写一些代码而不是使用正则表达式更适合完成这项任务。但我可以想到一种方法,应该可以使用负向先行断言。

以您的字符集为例,您允许的单词可以具有以下字母,并且不超过它们在列表中出现的数量。

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}) - 这个负向先行断言会拒绝包含3个或更多个字符“a”的输入,因为在这个集合中,“a”的总数只有2个。
  • (?!([^ã]*ã){2}) - 类似地,这个负向先行断言会拒绝包含2个或更多个字符“ã”的输入,因为在这个集合中,“ã”的总数只有1个。
  • 对于所有字符都是如此
  • [aãcelmot]{1,14} - 这个字符集至少捕获允许的字符,最多14个,虽然我们也可以简单地写成+,因为使用负向先行断言已经检查了允许的字符的最大数量。
  • $ - 字符串的结尾

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


1
我正在测试。非常感谢您的帮助。 - Eduardo Arruda Pimentel
1
@EduardoArrudaPimentel:没问题,如果你的任何测试失败了,告诉我,不过不应该会失败。 - Pushpesh Kumar Rajwanshi
1
我已经标记为已解决。经过测试,它对我有效。再次感谢您。 - Eduardo Arruda Pimentel
1
很高兴能帮助@EduardoArrudaPimentel :) - Pushpesh Kumar Rajwanshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接