2010-08-31 66 views
3

我正在尋找一個Oracle正則表達式,以任何順序匹配令牌。RegEx以任何順序匹配字符串標記?

例如,假設我正在尋找「one two」。

我希望它同時匹配, 「一個令牌兩個」 「另外兩個一個」

令牌的數量可能會增長大於二的,所以產生的正則表達式的置換將是一個無驅。

是否有更簡單的方法來做到這一點,比這個

'(ONE.*TWO)|(TWO.*ONE)' 

i.e 

select * 
from some_table t 
where regexp_like(t.NAME_KEY, '(ONE.*TWO)|(TWO.*ONE)') 

回答

1

您可以使用多種不同的正則表達式:

SELECT * 
FROM some_table t 
WHERE regexp_like(t.NAME_KEY, 'ONE') 
AND regexp_like(t.NAME_KEY, 'TWO') 

的一個問題是,這也將匹配「TWONE」其中原始正則表達式不匹配。如果您還檢查某些分離的令牌或字邊界,則可以修復此問題。

另外一個正則表達式不需要匹配一個常量字符串。你可以用LIKE代替。

+0

只需添加到這一點,你可以解決這樣的 'TWONE' 的問題:'REGEXP_LIKE(t.NAME_KEY「(^ | \ S)ONE( $ | \ s)')'有點粗糙,但它應該按照需要工作。做很多regexp_like可能會是一個很大的表現。你打算做多少?它可能會更好地探索其他方法,以更易於管理的形式存儲數據。 – 2010-08-31 17:24:24

+0

我將在一張非常大的桌子上執行此操作。表現是一個明確的關注。我認爲正則表達式比幾個LIKE表現得更好。 – Andy 2010-08-31 18:11:55

+0

@Andy Pryor:我幾乎可以保證[Oracle的全文搜索(FTS)](http://www.oracle-base.com/articles/9i/FullTextIndexingUsingOracleText9i.php)將超出等效的REGEX或LIKE功能。 – 2010-08-31 20:40:31