用于单词特定排列的正则表达式

Regex for specific permutations of a word

我正在开发一个 wordle 机器人,我正在尝试使用正则表达式匹配单词。我遇到了一个问题,我需要寻找给定单词的特定排列。

例如,如果单词是“偷”,则这些是所有排列: 'tesla'、'stale'、'steal'、'taels'、'leats'、'setal'、'tales'、'slate'、'teals', 'stela', 'least', 'salet'.

我在为此创建正则表达式时遇到了一些麻烦,但最终偶然发现了解决问题的积极前瞻。正则表达式 -

'(?=.*[s])(?=.*[l])(?=.*[a])(?=.*[t])(?=.*[e])'

但是,如果我们正在寻找特定的排列,我们该如何着手呢?

例如看起来像 's[lt]a[lt]e' 的单词。匹配词为'steal'、'stale'、'state'。但是我想限制匹配词中 l 和 t 的数量,这意味着输出应该是 'steal' & 'stale'。 1 个明显的解决方案是此正则表达式 r'slate|stale',但这不是通用解决方案。我正在尝试为任何场景找到一个通用的解决方案,并且使用上面的积极前瞻似乎是一个起点。但我无法得出解决方案。

我们是否将正前瞻与正常正则表达式结合起来?

s(?=.*[lt])a(?=.*[lt])e (Did not work)

或者我们写嵌套前瞻什么的?

还有一些无效的正则表达式 -

s(?=.*[lt]a[tl]e)
s(?=.*[lt])(?=.*[a])(?=.*[lt])(?=.*[e])

我试图浏览 SO 上的可用帖子,但找不到任何可以帮助我理解这一点的内容。感谢任何帮助。

您可以将匹配感兴趣的排列的正则表达式附加到您现有的正则表达式。在您的示例案例中,您将使用:

(?=.*s)(?=.*l)(?=.*a)(?=.*t)(?=.*e)s[lt]a[lt]e

这将只匹配 staleslate;它不会匹配 state 因为它没有通过需要 l 的前瞻。

请注意,您不需要 上述正则表达式中的 (?=.*s)(?=.*a)(?=.*e),因为与感兴趣的排列匹配的部分需要它们。我将它们保留下来以保留正则表达式的那部分通用性,而不依赖于它后面的内容。

Demo on regex101

请注意,为了允许重复字符,您可能需要将前瞻更改为以下形式:

(?=(?:[^s]*s){1}[^s]*)

您可以更改组中的量词以匹配所需字符出现的次数。