如何将逗号分隔的字符串列表替换为第一个匹配项


How do I replace a comma separated list of strings with the first occurrence?

WHERE MATCH (COALESCE(f1, f2, f3)) AGAINST (?) > 0
WHERE MATCH (COALESCE(f1)) AGAINST (?) > 0

想:

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

需要用 f1 替换COALESCE(f1, f2, f2, ...),如果存在多个字符串(用 , 分隔),则这是第一个字符串,或者只是字符串本身。

我正在研究这个:

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

我正在捕获MATCH内部的内容(1,需要更换的内容)和COALESCE内部的内容(2,替换)。

如何将 1 替换为 2 中的第一个值?

替换应从 COALESCE 开始,但前一部分必须匹配。使用 ''K 在之后重置(替换应开始的位置)。因此,第一部分可能看起来像MATCH's*'('K在这里开始替换并且模式继续:'s*COALESCE's*'('s*([^,)]+)......在第一个捕获组中捕获。

可选部分(?:,[^)]*)?满足闭合括号。对于AGAINST部分,可以使用前瞻:(?=')'s*AGAINST) 。所以整个模式可能是:

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

并替换为捕获的$1.在 regex101.com 进行测试

您可以使用以下内容进行匹配:

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

并替换为$1$2

查看演示