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

时间:2015-06-14 10:17:14

标签: php regex pcre


    httpSecurity
            .formLogin().loginPage("/login")
            .defaultSuccessUrl("/", true)
            .successHandler(new LoginSuccessHandler())
            .and()
            .sessionManagement()
            .sessionAuthenticationStrategy(sessionAuthenticationStrategy).maximumSessions(1).maxSessionsPreventsLogin(true)
            .and().and()
            .csrf().disable();
    return httpSecurity;

通缉:

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

需要仅使用WHERE MATCH (f1) AGAINST (?) > 0 WHERE MATCH (f1) AGAINST (?) > 0 替换COALESCE(f1, f2, f2, ...),如果存在多个字符串(由f1分隔),则为第一个字符串,或者只是字符串本身。

I'm working on this

,

我正在捕捉#\s*match\s*\((\s*coalesce\s*\((.+)\s*\))\s*\)\s+against#/i 内的内容(1,需要替换的内容)和MATCH内的内容(2,替代内容)。

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

2 个答案:

答案 0 :(得分:1)

替换应从template <class T, void(T::*)(int)> struct TemplateMagic {}; struct TestStruct { void operator>> (int) {} }; int main() { TemplateMagic<TestStruct, (&TestStruct::operator>>) >* ptr; } 开始,但前一部分必须匹配。之后使用\K for resetting(替换应该开始)。所以第一部分可能看起来像COALESCE这里开始替换和模式继续:MATCH\s*\(\K ...捕获第一个捕获组。

可选部分\s*COALESCE\s*\(\s*([^,)]+)以满足结束括号。对于(?:,[^)]*)?部分,可以使用lookaheadAGAINST。所以整个模式可能是:

(?=\)\s*AGAINST)

并替换为已捕获的/MATCH\s*\(\K\s*COALESCE\s*\(\s*([^,)]+)(?:,[^)]*)?\)(?=\)\s*AGAINST)/i Test at regex101.com

答案 1 :(得分:1)

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

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

并替换为$1$2

请参阅DEMO