RegEx以任何顺序匹配字符串标记?

问题描述:

我正在寻找一个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)') 

下面是一个使用全文搜索(FTS)功能的替代查询:

WHERE CONTAINS(t.name_key, 'ONE & TWO') > 0 

Precedence Examples for criteria evaluation explanation

相关:

+0

@Shannon Severance:问,你会收到^ – 2010-08-31 23:31:31

您可以使用多种不同的正则表达式:

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