2015-06-14 48 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

相關問題