正则表达式中的问题

时间:2012-08-12 11:32:03

标签: regex

我正在使用以下表达式:

/^[alopinme]{5}$/

这个正则表达式从我的一组单词中带出了一些字母,其中包含括号内的字母。

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

我想猜怎么能完成我的正则表达式,但我找不到正确的方法。

有人可以帮助我吗?

感谢。

编辑:

我在这里发布一个例子:

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

这个表达式选择了我的话:helms,moths meths homes等等......

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

结果可能会出现如下词:mozes,hoxes,tozes等等......如果你检查这些单词,你可以看到每个单词的大部分字母都来自集合A但只有一集来自集合B. / p>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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}$