正则表达式以任何顺序匹配字符串标记?
Posted
技术标签:
【中文标题】正则表达式以任何顺序匹配字符串标记?【英文标题】:RegEx to match String tokens in any order? 【发布时间】:2010-08-31 17:02:56 【问题描述】:我正在寻找可以按任何顺序匹配标记的 Oracle 正则表达式。
例如,假设我正在寻找“一二”。
我希望两者都匹配, “一令牌二” “另外两个”
令牌的数量可能会超过两个,因此为正则表达式生成排列会很麻烦。
还有比这更简单的方法吗
'(ONE.*TWO)|(TWO.*ONE)'
i.e
select *
from some_table t
where regexp_like(t.NAME_KEY, '(ONE.*TWO)|(TWO.*ONE)')
【问题讨论】:
【参考方案1】:这是一个使用全文搜索 (FTS) 功能的替代查询:
WHERE CONTAINS(t.name_key, 'ONE & TWO') > 0
请参阅Precedence Examples for criteria evaluation explanation。
相关:
Introduction to Oracle Text【讨论】:
@Shannon Severance:询问,您将收到 ^【参考方案2】:您可以使用几种不同的正则表达式:
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 可能会对性能产生很大影响。你打算做几个?探索其他方法可能会更好,以更易于管理的形式存储数据。
我将在一个非常大的表上执行此操作。性能是一个明确的问题。我在想正则表达式会比几个 LIKE 表现得更好。
@Andy Pryor:我几乎可以保证Oracle's Full Text Search (FTS) 的性能将优于等效的 REGEX 或 LIKE 功能。
@OMG Ponies:我很想看到使用 FTS 的答案。有一天,我需要探索这项技术。以上是关于正则表达式以任何顺序匹配字符串标记?的主要内容,如果未能解决你的问题,请参考以下文章