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

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, ...),如果存在多个字符串(由 , 分隔)或仅字符串本身,则为第一个字符串。

I'm working on this:

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

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

如何用 2 中的第一个值替换 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

并替换为捕获的Test at regex101.com

你可以只用下面的来匹配:

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

并替换为

DEMO