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

Php 正则表达式中的减法不会得到结果,php,regex,Php,Regex,我试图使用php函数preg_match从aaaa、aaab、.zzzz的范围中进行选择。正则表达式是:[b-df-hj-np-tv-z],[a-z-[aeiuo]],我从witch那里得到: 预匹配“/[a-z-[aeiuo]]/”,$line结果:无 preg_match“/[b-df-hj-np-tv-z]/”,$line结果:aaab、aaac、aaad、aaaf、aaag 这些假设都是相同的;至少有一个辅音的任何字符串 为什么第一个得不到任何东西?。谢谢 编辑:我唯一的疑问是为什么[a

我试图使用php函数preg_match从aaaa、aaab、.zzzz的范围中进行选择。正则表达式是:[b-df-hj-np-tv-z],[a-z-[aeiuo]],我从witch那里得到:

预匹配“/[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]相同的事情,仅此而已。我正在学习,请原谅我的混淆。

我认为第一个正则表达式是无效的。它处理a-z,然后找到一个-,左边什么都没有。
通过将[or]字符放在正则表达式的[]组中,它们将作为[and]字符处理,而不是作为单独的组处理。

正则表达式中没有减法

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


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

如果类减法不是一项功能,那么第一个示例将不会产生任何结果

看看这个,第二段引用了你的问题-

例如,[a-z-[aeiuo]]匹配不是元音的单个字母,即a 单辅音。如果没有字符类减法功能, 唯一的方法是列出所有辅音: [b-df-hj-np-tv-z]


要测试第一个正则表达式将匹配什么,请阅读

中的Your regular expression explained(您的正则表达式解释)部分。要实现类似的效果,可以将完整字母选择与元音的负前瞻相结合:

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

那个?![aeiou]部分匹配字符串中下一个字符不是[aeiou]的任何点。下面的[a-z]对其进行了限制,使其仅与字母匹配。这两个组合将只匹配辅音。

它不是无效的。它将匹配任何字母a到z或实际-实际上,它是有效的。-将匹配一个文本-如果不是范围的一部分,则正则表达式将要求字符串末尾有一个]才能匹配。但是,关于文字[的部分是正确的。对不起,我不知道,谢谢你的更正。我会修正这篇文章的。这里不也是z吗-[范围?好问题。这里有一个+1来抵消它,因为你的答案是正确的和相关的。虽然从技术上讲它可以找到一些东西:它将查找任何小写字符、连字符或开放方括号,然后是封闭方括号。它基本上可以压缩为[a-z-[]@ChicagoRedSox是的。我的意思是,对于作为输入的字符,它将给出零结果。你几乎正确地知道它将匹配什么,请在我的编辑中检查链接。主要的一点是PHP不支持字符类中的集减法。中的前瞻解决方案在任何支持前瞻的风格中都可以工作。有字符类减法只是它不是由PCRE实现的。这应该被标记为答案。至少帮助了我;