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

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 的答案。有一天,我需要探索这项技术。

以上是关于正则表达式以任何顺序匹配字符串标记?的主要内容,如果未能解决你的问题,请参考以下文章

以任何顺序匹配查询中的所有单词的正则表达式

字符串的正则表达式不以给定的后缀结尾

正则表达式:我想要这个和那个和那个......以任何顺序

正则表达式匹配

求正则表达式:除了汉字以外,所有字符的正则表达式,在js里面用到

正则表达式