2015-06-14 51 views
1
WHERE MATCH (COALESCE(f1, f2, f3)) AGAINST (?) > 0 
WHERE MATCH (COALESCE(f1)) AGAINST (?) > 0 

寻求:如何用第一次出现替换逗号分隔的字符串列表?

WHERE MATCH (f1) AGAINST (?) > 0 
WHERE MATCH (f1) AGAINST (?) > 0 

极品substritute COALESCE(f1, f2, f2, ...)f1,即如果多个字符串存在(由,分隔)的第一个字符串或只是字符串本身。

I'm working on this

#\s*match\s*\((\s*coalesce\s*\((.+)\s*\))\s*\)\s+against#/i 

而且我捕捉这两个里面有什么MATCH(1,公司需要更换什么的),什么是内COALESCE(2,更换)。

我如何用2中的第一个值代替1?

回答

1

替换应该从COALESCE开始,但前一部分必须匹配。之后使用\K for resetting(更换应该开始)。因此,第一部分可能看起来像MATCH\s*\(\K这里开始替换和模式继续:\s*COALESCE\s*\(\s*([^,)]+) ...在第一捕获组捕获。

和可选部分(?:,[^)]*)?以符合闭合括号。对于AGAINST部分,可使用lookahead(?=\)\s*AGAINST)。所以整个模式可能是:

/MATCH\s*\(\K\s*COALESCE\s*\(\s*([^,)]+)(?:,[^)]*)?\)(?=\)\s*AGAINST)/i 

并用捕获的$1替换。 Test at regex101.com

+0

我是从得到这个工作非常远。非常感谢您,即使使用多个“MATCH”,也能令人惊叹。 – gremo

+0

@gremo很高兴它为你工作,本来可以帮助:) –

1

你可以使用下面的匹配:

(MATCH\s*\()COALESCE\(([^,)\s]+)(?:\s*,[^)]+)?\) 

而且随着$1$2

更换见DEMO

+0

如果你的意思是没有'比赛',那么没有。出于好奇,'COALESCE'会自动添加到我的SQL中,并且大部分时间都需要它。不幸的是,你不能使用'MATCH(COALESCE(f1,f2))',所以我需要删除它。 – gremo

+0

@gremo你想删除'MATCH'吗?我力图得到你的观点..请检查演示.. :) –

+0

我明白了,你总是替代'COALESCE'。但是我只需要在'MATCH'内部完成,就像我在第一次评论中所说的那样,'SELECT COALESCE(a,b)'应该保持不变。 – gremo

相关问题