2014-01-15 105 views
0

有人可以帮助我请建立一个字符串正则表达式,我的同事问我,但我从来没有发现任何正则表达式为A & B或A^B。正则表达式(A或A或A和B),(A但不是B)

这是我的实际代码

'(Eclipse|Sun)' => array(
        'Got' => 'Power 50', 
        'World' => 'EU'),); 

我怎么能执行一个正则表达式来有以下选择: “日蚀”或“太阳”或“日食&太阳”。

我的第二个问题是关于[^]列出哪些字符,我不想要。 我如何执行一个正则表达式来说“Eclipse [^ Oracle]” 因为我想用“Eclipse”选择字符串,但是我不想让“Eclipse”和“Oracle”有字符串。

'Eclipse[^Oracle]' => array(
        'Note' => 'Density 200', 
        'City' => 'Prague'),); 
+0

你可以从这里开始[前瞻和回顾后零长度断言(http://www.regular-expressions.info/lookaround.html) – hwnd

+0

我看到它,但没有找到我想要的东西。因为Oracle没有附加Eclipse,所以更像是“bla bla Eclipse bla” – user3114471

+0

@hwnd您有任何解决方案吗?或者你能解释更多关于正则表达式的知识。 – user3114471

回答

1

问题:我如何执行正则表达式以在“Eclipse”或“Sun”或“Eclipse & Sun”之间进行选择。

答:可以交替使用来实现这一目标。像这样:

(Eclipse&Sun|Eclipse|Sun) 

交替工作的方式是,如果它匹配第一个表达式,它不会尝试第二个和第三个。创建表达式时需要考虑这一点。


问:我怎么能执行一个正则表达式说“日蚀[^甲骨文]”因为我想用“日蚀”,选择字符串,但我不希望有字符串“ Eclipse“和”Oracle“。

答:如果你想只匹配的东西,而不同的词不存在,你可以使用正向前看符号匹配之前验证字符串。像这样:

^.*(?=^.*(Eclipse))(?!^.*Oracle).*$ 
  • 如果Eclipse中存在(?=^.*Eclipse)
    • 这将会把“日蚀”到反向引用的数字捕获组1
  • 匹配将失败,如果甲骨文的比赛将通过存在(?!^.*Oracle)

正则表达式演示在这里:

Regex101, Positive Lookaheads

+0

感谢第二个工作。 – user3114471

0

第一:Eclipse OR Sun OR (Eclipse AND Sun) <=> Eclipse OR Sun

if (preg_match('~\b(?:Eclipse|Sun)\b~', $str)) { 
... 
} else { ... } 

二:Eclipse^Oracle

if (preg_match('~(?=.*\bEclipse\b)(?!.*\bOracle\b)~', $str)) { 

(?=...)其次
(?!...)不跟

相关问题