3

我正在使用以下表达式:

/^[alopinme]{5}$/

这个正则表达式从一组单词中提取单词,其中的字母包含在括号内。

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

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

任何人都可以帮助我吗?

谢谢。

编辑:

这里我贴一个例子:

SELECT sin_acentos FROM Finder.palabras_esp WHERE sin_acentos REGEXP '^[tehsolm]{5}$'

这个表达选择了我喜欢的词:helms、moths meths home等等......

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

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

4

2 回答 2

2

由于您要查找的单词都是五个字符长,因此我可以想到一个相当难看的表达式来解决问题:假设[alopinme]是您的基本集,并且[xyz]是您的可选集。然后表达式

/^([alopinmexyz][alopinme]{4}|[alopinme][alopinmexyz][alopinme]{3}|[alopinme]{2}[alopinmexyz][alopinme]{2}|[alopinme]{3}[alopinmexyz][alopinme]|[alopinme]{4}[alopinmexyz])$/

应该允许您正在寻找的结构的五个字母单词。

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

/^[^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
于 2012-08-12T11:42:37.790 回答
2

如果其他字符之一应该只出现一次,您可以使用:

^(?=.{5}$)[alopinme]*(?:[XYZ][alopinme]*)?$
  • (?=.{5}$)- 检查字符串是否有 5 个字符长,甚至在匹配之前。(这可能不适用于 MySql)
  • [alopinme]*- 来自 A 的字符
  • (?:[XYZ][alopinme]*)?- 可选 - B 中的一个字符,A 中的更多字符。

工作示例:http ://rubular.com/r/aw6l561Int

或者,如果您希望它们最多 3 次,例如:

^(?=.{5}$)[alopinme]*(?:[XYZ][alopinme]*){0,3}$
于 2012-08-12T11:51:45.460 回答