正则表达式匹配任意顺序的字符串标记?

3
我正在寻找一种能够匹配任意顺序的Oracle正则表达式。
例如,假设我要查找"one two"。我希望它能够匹配以下两个值: "one token two" "two other one"
如果tokens的数量增加到超过两个,那么生成正则表达式的排列组合将会很麻烦。
有没有比这更简单的方法呢?
'(ONE.*TWO)|(TWO.*ONE)'

 i.e

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

6
这里有一个使用全文搜索(FTS)功能的替代查询方法:
WHERE CONTAINS(t.name_key, 'ONE & TWO') > 0

请参见优先级示例以了解标准评估的解释。
相关内容:

@Shannon Severance:有求必应 ^ - OMG Ponies

1

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

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

一个问题是这也会匹配'TWONE',而原始的正则表达式不会匹配。如果您还检查一些分隔符或单词边界,可以解决此问题。

另外,使用常量字符串不需要正则表达式。您可以使用LIKE代替。


只是补充一下,你可以像这样解决'TWONE'问题:regexp_like(t.NAME_KEY, '(^|\s)ONE($|\s)')。虽然有点粗糙,但应该能够按预期工作。做很多regexp_like可能会对性能造成很大的影响。你计划做多少个?最好探索其他方法,将数据存储在更易管理的形式中。 - Gary Green
我将在一个非常大的表上执行此操作。性能是一个明确的问题。我认为正则表达式比多个LIKE更有效率。 - Andy
@Andy Pryor:我几乎可以保证Oracle的全文搜索(FTS)将优于等效的REGEX或LIKE功能。 - OMG Ponies
@OMG Ponies:我很想看到使用全文搜索的答案。总有一天我需要探索一下这项技术。 - Shannon Severance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接