regex 如何从这个字符串中提取分配给x的值?

oalqel3c  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(246)

我正在尝试创建一个正则表达式,可以用来提取以下字符串中分配给变量x的值:
(req.idf=6ca9a AND (req.ster=201 OR req.ster=st_home) AND (req.ste=hi OR req.ster=hijst_iuer OR ((req.ster=laHome OR req.ster=laHome_Jtre) AND (tax=IN OR taxIP=MX))) AND NOT ((x=u259 AND (x=66438 OR x=5423)) OR x=9853))AND(NOT x=28743)
我试图通过获得分配给变量x的数值来获得以下格式的输出:66438、5423、9853、28743
到目前为止,我已经尝试创建regex如下:(x=[^)]+)\bx=([^)]+)\b,但我无法获得所需的输出。
我将在Redshift中使用regexp_substr函数进行查询。

jdgnovmf

jdgnovmf1#

REGEXP_SUBSTR的第五个参数允许使用PCRE

  • 参数 *

一个或多个字符串文本,指示函数如何匹配模式。可能的值如下:
[...]

  • p -使用Perl兼容正则表达式(PCRE)方言解释模式。

这个正则表达式将允许你使用一个正向后查找来得到你想要的:

(?<=(\s|\()x=)\d+

我在前面添加了一个'('或' ',以防字符串有些可变,但对于您的示例来说,这应该不是必需的。
你可以检查here

qyuhtwio

qyuhtwio2#

function test(regex,str){
        let temp=regex.exec(str)?.at(1)??false; //first match is to prevent unwanted coma and if no matches, then returns value after ??'
        while(m=regex.exec(str)?.at(1)){temp+=`, ${m}`;} //iterate every matches; use ?.at(1) instead of [1] to prevent TypeError then if no match You will get falsy check
        return temp;
        }
    
    console.log(test(/\bx=([\d]+)\b/g,
         "(req.idf=6ca9a AND (req.ster=201 OR req.ster=st_home) AND (req.ste=hi OR req.ster=hijst_iuer OR ((req.ster=laHome OR req.ster=laHome_Jtre) AND (tax=IN OR taxIP=MX))) AND NOT ((x=u259 AND (x=66438 OR x=5423)) OR x=9853))AND(NOT x=28743)"))

您将不得不迭代匹配。

function test(regex,str){
    let temp=regex.exec(str)?.at(1)??false; //first match is to prevent unwanted coma and if no matches, then returns value after ??'
    while(m=regex.exec(str)?.at(1)){temp+=`, ${m}`;} //iterate every matches; use ?.at(1) instead of [1] to prevent TypeError then if no match You will get falsy check
    return temp;
    }

test( /\bx=([\d]+)\b/g,
     "(req.idf=6ca9a AND (req.ster=201 OR req.ster=st_home) AND (req.ste=hi OR req.ster=hijst_iuer OR ((req.ster=laHome OR req.ster=laHome_Jtre) AND (tax=IN OR taxIP=MX))) AND NOT ((x=u259 AND (x=66438 OR x=5423)) OR x=9853))AND(NOT x=28743)")

Jus run my code snippet:)

相关问题