正则表达式中的减法不会得到结果

时间:2014-02-22 23:04:27

标签: php regex

从一系列 aaaa,aaab,.... zzzz 我正在尝试使用php函数preg_match进行选择。正则表达式是:[b-df-hj-np-tv-z][a-z-[aeiuo]]来自女巫:

preg_match('/[a-z-[aeiuo]]/',$line)结果:没什么

preg_match('/[b-df-hj-np-tv-z]/',$line)结果:aaab,aaac,aaad,aaaf,aaag....

这些假设是相同的;任何至少有一个辅音的字符串。

为什么第一个没有得到任何东西?感谢

编辑:我唯一的主要疑问是为什么[a-z-[aeiuo]][b-df-hj-np-tv-z]没有做同样的事情。我正在努力学习,请原谅我的困惑。

5 个答案:

答案 0 :(得分:2)

你可以做些什么来实现类似的东西是将完整的字母选择与元音的负向前瞻相结合:

/(?![aeiou])[a-z]/

(?![aeiou])部分匹配字符串中下一个字符不是[aeiou]的任何点。以下[a-z]限制它,因此它只匹配字母。这两个组合只会匹配辅音。

答案 1 :(得分:1)

在正则表达式中没有减法这样的东西。

[a-z-[aeiou]]并不意味着“a-z减去[aeiou]”

使用您已有的[b-df-hj-np-tv-z]

答案 2 :(得分:0)

如果您只想要任何至少有一个辅音的字符串(假设用字符串表示用逗号分隔),您可以检查是否有任何有nn的位置-consonant并且没有逗号在字符串中:

preg_match(/[^,]*?[^aeiou][^,]*?/,$line,$matches) //$matches will have all of the strings that fit the description

如果你只是想查找是否有任何辅音,你可以使用:

preg_match(/[^aeiou]/,$line) //returns bool value

这也假设除了,之外没有其他符号。

答案 3 :(得分:0)

如果类减法不是一个特征,那么第一个例子就不会产生任何结果。

检查此link(第二段引用您的确切问题) -

  

E.g。 [a-z- [aeiuo]]匹配不是元音的单个字母(即a   单个辅音)。没有字符类减法功能,   唯一的方法是列出所有辅音:   [B-DF-HJ-NP-TV-Z]。

要测试第一个正则表达式匹配的内容,请阅读Here

中的“正则表达式解释”部分

答案 4 :(得分:-1)

我认为第一个RegEx表达式无效。它处理a-z,然后找到-,左侧没有任何内容。[]个字符放在RegEx中的[]组内,它们将被处理为[]个字符,而不是分开的组。< / p>