在regexp中发出

在regexp中发出,regex,Regex,我使用以下表达式: /^[alopinme]{5}$/ 这个regexp从括号中包含字母的一组单词中提取单词 现在,我需要为这样的表达式添加更多的功能,因为我需要获取的单词只能包含另一组字母中的一个字母。假设我想让单词由集合A中的字母组成,可以包含集合B中的一个字母(如果存在) 我试图猜测如何完成正则表达式,但我没有找到正确的方法 有人能帮我吗 谢谢 编辑: 这里我举一个例子: SELECT sin_acentos FROM Finder.palabras_esp WHERE sin_acen

我使用以下表达式:

/^[alopinme]{5}$/
这个regexp从括号中包含字母的一组单词中提取单词

现在,我需要为这样的表达式添加更多的功能,因为我需要获取的单词只能包含另一组字母中的一个字母。假设我想让单词由集合A中的字母组成,可以包含集合B中的一个字母(如果存在)

我试图猜测如何完成正则表达式,但我没有找到正确的方法

有人能帮我吗

谢谢

编辑:

这里我举一个例子:

SELECT sin_acentos FROM Finder.palabras_esp WHERE sin_acentos REGEXP '^[tehsolm]{5}$'
这句话让我选择了这样的词:赫尔姆斯、飞蛾、冰毒之家等等

但我需要添加一组B字母,并从这些字母中获取只能包含一个字母的单词。假设我有另一组字母[xzk],因此表达式可以得到更多的单词,但只能从集合B中选择一个字母


结果可以得到诸如:mozes、hoxes、tozes等词。。。如果你检查这些单词,你会发现每个单词的大多数字母都来自集合A,但只有一个来自集合B。

由于你要查找的单词都是五个字符长的,我可以想出一个相当难看的表达式来实现这个目的:假设
[alopinme]
是你的基本集合,而
[xyz]
是您的可选设置。然后是表情

/^([alopinmexyz][alopinme]{4}|[alopinme][alopinmexyz][alopinme]{3}|[alopinme]{2}[alopinmexyz][alopinme]{2}|[alopinme]{3}[alopinmexyz][alopinme]|[alopinme]{4}[alopinmexyz])$/
应该允许五个字母的单词的结构,你正在寻找

通常,需要计算任何东西都会使您的正则表达式不可读。像这样的问题很好地说明了这一点:编写
/^[alopinmexyz]{5}$/
表达式,并在代码中添加一个额外的步骤来检查
[xyz]
在文本中出现的次数不超过一次,要容易得多。您甚至可以使用regexp执行附加检查:

/^[^xyz]*[xyz]?[^xyz]*$/
SQL中的结果如下所示:

SELECT sin_acentos
FROM Finder.palabras_esp
WHERE sin_acentos REGEXP '^[tehsolmxyz]{5}$'      -- Length == 5, all from tehsolm+xyz
  AND sin_acentos REGEXP '^[^xyz]*[xyz]?[^xyz]*$' -- No more than one character from xyz

如果其中一个字符恰好出现一次,则可以使用:

^(?=.{5}$)[alopinme]*(?:[XYZ][alopinme]*)?$
  • (?=.{5}$)
    -检查字符串长度是否为5个字符,甚至在匹配之前。(这在MySql上可能不起作用)
  • [alopinme]*
    -来自
  • (?:[XYZ][alopinme]*)?
    -可选-从B中选择一个字符,从A中选择更多字符
工作示例:

或者,如果您最多需要3次,例如:

^(?=.{5}$)[alopinme]*(?:[XYZ][alopinme]*){0,3}$

什么语言。不同语言的正则表达式略有不同。好吧,我用mysql和action脚本来实现它。在两种语言中我都使用这种表达方式。我可以在这两个方面进行调整。有几个例子说明什么应该匹配,什么不应该匹配,在这里真的很有帮助。所以你正在写一个工具,帮助你赢得“拼字游戏”或“与朋友的话”。骗子!;-)无论如何,这是一个很好的用例。但是OP实际上不应该使用这个正则表达式:)为什么不编写一些简单的字符串操作代码来处理这个问题?@dasblinkenlight,这个表达式“/^[^xyz]*[xyz]?[^xyz]*$/”意味着在这样的集合中只过滤一个字母?@domoindal Yes,如果扩展集
[xyz]
中有多个字符,则第二个表达式将失败。。。我正在检查您的表达式,发现mysql中有一个错误->从regexp中得到错误“repeation operator operator invalid”。我使用了这个:从Finder.palabras中选择sin_acentos,尤其是sin_acentos REGEXP'^(?=.{5}$)[ABCEPOXYZ]*(?:[XYZ][ABCEPOXYZ]*)?$”@domoindal——正如我所说的——我怀疑它在MySql上是否有效,但它在ActionScript上会起作用。我在您的示例代码之前发布了它,但我希望它无论如何都会有用…啊,太好了。。。我会在动作脚本中尝试。这样的表达让我得到5个字母的单词,这些单词是由这组[alopinme]中的字母组成的,如果有的话,只有[XYZ]中的1个字母?如果是这样的话,这样的表达式比我使用的表达式更强大,因为我不需要添加传统的过滤器。在表达式中添加过滤器是否可以避免集合a中的字母在结果中重复?@domoindal-有很多方法可以使用该模式。首先,是的,这是可能的。例如,添加类似于
^(?)[alopinme]*([alopinme])[alopinme]*\1)
(对于第一组),或
^(?)(.*).\1)
(对于整个单词)。但是:1。您的下一个问题可能是关于不止一次地包含一封信:
[aaabc]
,这不容易。2.越来越难看了。