【问题标题】:RegEx for matching words only formed with a list of lettersRegEx 用于匹配仅由字母列表组成的单词
【发布时间】:2019-09-25 10:11:35
【问题描述】:

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

例子:

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 个 o 这将是 toooo = false ?
  • @G.aziz,是的。如果有 5 个 O,这将是 toooooo = true,但是, toooooo = false。
  • 我不认为这个问题可以使用正则表达式来解决。正则表达式是一个没有内存的有限状态机,因此无法记住一个字符在一个序列中匹配了多少次

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


【解决方案1】:

虽然我觉得这个任务更适合编写一些代码而不是使用正则表达式。但我认为应该可行的一种方法是使用负面展望。

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

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} - 此字符集捕获至少 1 到最多 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)))

【讨论】:

  • 我正在测试。非常感谢您的帮助。
  • @EduardoArrudaPimentel:当然,如果您的任何测试失败,请告诉我,尽管不应该。
  • 我已标记为已解决。经过测试,它对我有用。再次感谢您。
  • 很高兴帮助@EduardoArrudaPimentel :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2023-02-13
  • 1970-01-01
  • 2020-02-02
  • 2017-10-22
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多