2014-01-15 148 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)) { 

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

相關問題