用javascript解析BEM类选择器的正则表达式
我的问题是: 我想把一个字符串拆分成一个对象数组。 我的字符串是一个BEM类选择器,如下所示: 其中我的字符串(不带点)将通过匹配“\uuuuu”和“---”进行拆分用javascript解析BEM类选择器的正则表达式,javascript,regex,Javascript,Regex,我的问题是: 我想把一个字符串拆分成一个对象数组。 我的字符串是一个BEM类选择器,如下所示: 其中我的字符串(不带点)将通过匹配“\uuuuu”和“---”进行拆分 foo-bar--baz_uuu-foo--bar=['foo-bar'、'-baz'、'uuuu-foo'、'-bar'] foo-bar--baz=['foo-bar','--baz'] foo-bar\uuuuu-bar--baz=['foo-bar','uuuuuu-bar','--baz'] foo=['foo'] 我尝
foo-bar--baz_uuu-foo--bar
=['foo-bar'、'-baz'、'uuuu-foo'、'-bar']
foo-bar--baz
=['foo-bar','--baz']
foo-bar\uuuuu-bar--baz
=['foo-bar','uuuuuu-bar','--baz']
foo
=['foo']
我尝试使用以下正则表达式:
const regex = /([a-zA-Z0-9']+)(--[a-zA-Z0-9']+)(__[a-zA-Z0-9']+)/g;
while (match = reg.exec(string)) {
var group1 = match[1];
var group2 = match[2];
var group3 = match[3];
console.log(group1+'; '+group2+'; '+group3);
}
但是foo-bar--baz__;u-foo-bar
仅输出:
foo-bar --baz __foo
而不是最后一条
我不明白为什么
另外,也许有更好的整体解决方案来解决我的问题
感谢您的帮助我对边界元法一无所知,但将字符串拆分为对象很容易。我不知道它是否有效。它无法处理字符串中的更多项
var a=“foo-bar--baz\uu-foo--bar”
变量名称=[“块”、“修改器”、“元素”、“修改器”];
var arr=a.split(/--| uu/g).map(函数(el,i){
var obj={};
obj[name[i]]=el;
返回obj;
});
控制台日志(arr)代码>试试这个:([a-zA-Z0-9^]+[-]?[a-zA-Z0-9^]+)(?:-||)([a-zA-Z0-9^]+[-]?[a-zA-Z0-9^]+)
要解析BEM类选择器,您可以使用,但foo-bar--baz_uu-foo--bar
似乎不是BEM选择器;) 你确定foo-bar--baz_u_-foo--bar
是一个“有效”的BEM标识符吗?@evolutionxbox是的,这是一个在各种BEM风格中都有效的BEM类。@zzzzBov这很奇怪。该选择器似乎是BMBEM。@evolutionxbox它只是一个示例,但我不推荐使用it@evolutionxbox“边界元法”的名称并不是为了规定部件的顺序或数量。否则,大多数类将只是B
、BM
或be
。是的,至少不是一个好的类,但这只是一个示例;)。BEM有很多种风格。BEM-naming的设计目的是支持不同的风格,但它仍然无法帮助使用这种特定的命名方案:)Arrrrg,我不太在乎这不是我的观点……它可能是错误的,也可能不是,我只想拆分它……我误读了你的评论,我以为你在争论选择器的有效性。:)谢谢,但这只适用于示例选择器,如果我在最后一个位置有一个元素,您的代码仍将使用“修饰符”键。@Gaelboyendal您可能需要对“多种口味”命名更加严格。这看起来不是更好吗<代码>([a-z0-9]+({1})?[a-z0-9]+)|(-| |)