正则表达式匹配模式结果为单行而不是数组

问题描述 投票:0回答:1

所以我有我写的当前代码

let css = `
flexGrow:1 backgroundColor:$baC-transparent maxWidth:1601 eq_last:{flexGrow:-1 backgroundColor:$baC-transparent maxWidth:1601} eq_0:{flexGrow: 0 backgroundColor:$baC-transparent maxWidth:1601} eq_1:{flexGrow:1 backgroundColor:$baC-transparent maxWidth:1601 eq_0:{kasd}} 
`
//css = css.replace(/eq_/g, "\neq_")
let match = css.match(/eq_(.*)(\{)(.*)(\})/g);
console.log(match)

问题在于结果,请注意,我将字符串放在一行中,并且 match 在一行中返回整个内容

我需要当前结果

[
eq_last:{flexGrow:-1 backgroundColor:$baC-transparent maxWidth:1601},
eq_0:{flexGrow: 0 backgroundColor:$baC-transparent maxWidth:1601},
eq_1:{flexGrow:1 backgroundColor:$baC-transparent maxWidth:1601 eq_0:{kasd}},
]

我希望匹配忽略内部

eq_0
并返回上面的结果。

任何带有正则表达式或其他方式的解决方案都会出现,但它必须很快。

javascript regex
1个回答
0
投票

我已经尝试过这个,有效

eq_\w+:\{(?:[^{}]|\{[^{}]*\})*\}

但是,我正在尝试匹配所有嵌套内容,这在计算上可能会很昂贵。我不知道计算时间在您的应用程序中是否重要。如果是,您还可以使用手动解析来遍历字符串并以编程方式匹配左大括号和右大括号。下面是提取第一级

eq_
块的方法示例:

const extractTopLevelEqBlocks = (css) => {
    const result = [];
    let stack = [];
    let startIndex = -1;
    let insideEqBlock = false;

    for (let i = 0; i < css.length; i++) {
        
        if (css.startsWith('eq_', i) && (css[i - 1] === ' ' || i === 0) && !insideEqBlock) {
            insideEqBlock = true;
            startIndex = i;
        }

        if (insideEqBlock) {
            
            if (css[i] === '{') {
                stack.push('{');
            }
            
            else if (css[i] === '}') {
                stack.pop();
                if (stack.length === 0) {
                    result.push(css.slice(startIndex, i + 1));
                    insideEqBlock = false;
                    startIndex = -1;
                }
            }
        }
    }

    return result;
};

const css = `
flexGrow:1 backgroundColor:$baC-transparent maxWidth:1601 eq_last:{flexGrow:-1 backgroundColor:$baC-transparent maxWidth:1601} eq_0:{flexGrow: 0 backgroundColor:$baC-transparent maxWidth:1601} eq_1:{flexGrow:1 backgroundColor:$baC-transparent maxWidth:1601 eq_0:{kasd}} 
`;

const blocks = extractTopLevelEqBlocks(css);
console.log(blocks);

© www.soinside.com 2019 - 2024. All rights reserved.