regex 使用正则表达式捕获% number或none关键字

nwsw7zdq  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(92)

我必须捕获颜色语法,可以是数字%或 * 无 * 关键字,按照CSS规范。
下面是我的正则表达式,它捕获了数字%,但无法捕获none关键字

((?:rgba?|hsla?|hwb|(ok)?lab|(ok)?lch)\((:?-?[\d.]+%?(deg|rad|grad|turn)?[,\s]+){2,3}[\s/]*-?[\d.]+%?\))

但是当我们在语法中使用 none 关键字时,它没有捕获。

const str = `{  
    rgb(102 none none / none);
    rgba(40%, 20%, 60%, 100%);
    hsl(270deg none none);
    hsla(270deg none none 100);
    hwb(0.75turn 20 40));
    hwb(none 20% 40%);
    lch(32.39 61.25 none)
    oklch(0.44 0.16 303.38)
    lab(32.39 38.43 -47.69 / 1)
    oklab(44% 0.09 -0.13)
    hwb(0.75turn 20% 40%);
    rgba(40%, 20%, 60%, 100%);
    hwb(4.712rad 20% 40%);
}`;

const ptrn = `((?:rgba?|hsla?|hwb|(ok)?lab|(ok)?lch)\\((:?-?[\\d\.]+%?(deg|rad|grad|turn)?[,\\s]+){2,3}[\\s/]*-?[\\d\.]+%?\\))`;

const rgx = new RegExp(ptrn, 'mig');

const matches = str.matchAll(rgx);

[...matches].forEach( m => {
 console.log(m[1]);
})

如何在正则表达式中包含它?
working example

2sbarzqh

2sbarzqh1#

只需为数字部分创建一个替代模式。我还允许更多白色:

const str = `{  
    rgb(102 none none / none);
    rgba(40%, 20%, 60%, 100%);
    hsl(270deg none none);
    hsla(270deg none none 100);
    hwb(0.75turn 20 40));
    hwb(none 20% 40%);
    lch(32.39 61.25 none)
    oklch(0.44 0.16 303.38)
    lab(32.39 38.43 -47.69 / 1)
    oklab(44% 0.09 -0.13)
    hwb(0.75turn 20% 40%);
    rgba(40%, 20%, 60%, 100%);
    hwb(4.712rad 20% 40%);
}`;

const ptrn = `((?:rgba?|hsla?|hwb|(ok)?lab|(ok)?lch)\\s*\\(\\s*(:?(-?[\\d\.]+%?(deg|rad|grad|turn)?|none)[,\\s]+){2,3}[\\s/]*(-?[\\d\.]+%?|none)\\s*\\))`;

const rgx = new RegExp(ptrn, 'mig');

const matches = str.matchAll(rgx);

[...matches].forEach( m => {
 console.log(m[1]);
})

相关问题