在Javascript中,我有一个输入字符串:
var str = "[header fullwidth short color =red text = big] [anotherObj flag attr=1] ..."
(注意:这些空间是故意的)
我想检索对象列表,每个对象都有三个特性:
我编写了这个函数,它获取对象和属性的类型,但不是标志(没有值的属性; IE布尔值)
function parseElements(str) {
var eles = str.match(/[^\[\]]+(?=\])/g);
return (eles||[]).filter(function(ele) {
var split = /\s*([^\s]+)\s*(.*)/.exec(ele);
type = split[1],
options = split[2].match(/\s*([a-zA-Z]+\s*=\s*[^\s]+)/gm),
// flags = NEED REGEX HERE
return {type: type, options: options, flags: null};
});
}
答案 0 :(得分:1)
标志尝试这样的事情:
/ (\w+)(?= [^=])/
然后移除header
(如同所有匹配但是第一个),因为这似乎最简单。
快速expalanation:这将匹配1个或2个非等号字符(在[a-zA-Z_]
)前面的1个或多个单词字符,只要它们后面没有2个非等号符号,所有属性都是是
编辑:我在你的帖子之前写了这个,所以它在整个字符串上匹配,然后再拆分。
编辑2:通过讨论聊天(见下文),我意识到两侧都允许使用可选空格,这在javascript中不起作用,因为缺少负面的lookbehind运算符,两侧都需要可选空格被删除,上面的正则表达式工作。感谢Sharang确认是这种情况(如果任何人都能想到这种方式可以使用单个正则表达式的双方可选空格,我会非常有兴趣看到它,我认为这是不可能的,如上所述)编辑3:有人指出属性是可选的,所以新的正则表达式是:
/ (\w+)(?=(?: [^=])|$)/gm
基本相同,但允许它后面的行结束。