2014-08-28 53 views
0

我正在使用一個採用PCRE兼容正則表達式的系統。從捕獲組中排除子串

系統將捕獲組1存儲到數據庫中。

我需要用分隔符(不包括分隔符)將字符串的兩半作爲單個捕獲組捕獲。

鑑於字符串:「我想捕捉此位,但不是這一點,肯定此位」

,我感到我可以創建這樣一個正則表達式:

([A-Za-z/s]*) but not this bit([A-Za-z/s]*) 

這給我兩捕獲組: 組1:「我想捕獲這個位」 組2:「絕對是這個位」

但是,我錯過了我的一半結果,因爲組1是所有存儲的。

+0

爲什麼不試試這個http://regex101.com/r/lD8nJ2/2? – 2014-08-28 14:26:19

+0

你錯過了'g'修飾符,它告訴正則表達式在第一次匹配後繼續,所以通常是'/([A-Za-z/s] *)而不是這個位([A-Za-z/s] *)/ g',這取決於你的PCRE系統的語法可能不同 – Tensibai 2014-08-28 14:31:04

+0

一種方法是首先檢查輸入是否包含'但不是這個位'。如果確實如此,則從輸入中刪除「但不是這個位」,並捕獲捕獲的組1的其餘部分。 – anubhava 2014-08-28 14:37:34

回答

2

您可能正在考慮分支重置功能。但這只是一個假設。

(?|([a-zA-Z\s]+) but not this bit|([a-zA-Z\s]+)) 

如評論中所述,您可以使用正確的語法修復此問題。

([A-Za-z\s]+) but not this bit([A-Za-z\s]+) 
+0

是的,分支重置組很好,但它不是這項工作的工具。問題是第二組總是捕獲一個空字符串,並且通過將'/ s'更改爲'\ s'來解決這個問題。將'*'改成'+'也很好,如果你可以用'+'代替,你不應該使用'*'。它只會讓你面對糟糕的表現和沉默的失敗。 – 2014-08-28 18:07:08