我有类似的东西:
[@parameter='value']
和
[@parameter]
我需要regexp来解析这两种情况, 在第一个返回参数&第二个参数中的值
现在,我有类似的东西
"[@short-name='shorty']".match(/\[\@(.*)\=\'(.*)\'\]/)
返回
["[@short-name='shorty']", "short-name", "shorty"]
它很棒,但仅在第一种情况下,请帮助
修改
我只是认为可能有两个匹配可以被一个替换,所以如果可能的话,当前解决方案的一点扩展将是很好的。
匹配:
PARENT//CHILD[@parameter='value']
或
PARENT//CHILD[@parameter]
或
PARENT//CHILD
应该返回
[ parent, child, parameter, value ]
[ parent, child, parameter ]
[ parent, child ]
非常感谢!
编辑2:
好吧,这很容易
/([A-Z]+)\/\/([A-Z]+)(\[@([^=\]]*)(?:='(.*)'])?)?/
如果可以更轻松地完成,请告诉我如何
答案 0 :(得分:1)
这适用于您的一般情况:
/\[@([^=\]]*)(?:='(.*)'])?/
我删除了你正在做的很多不必要的逃避。 值在括号中(由于?:
未捕获),然后变为可选。必须将\[@.*
更改为\[@[^=\]]
,以便它只会尝试捕获等于或大括号(其中任何一个都可能存在)。
你也可以更新它以正确匹配引号,甚至省略它们
/\[@([^=\]]*)(?:=(['"]?)(.*)\2])?/
编辑:您还可以使用类似的表达式匹配每行的多个值;只需添加.*?
即可捕获值。
"[@short-name='shorty'] [@long-name=\"longy\"] [@longest]".replace(
/\[@([^=\]]*)(?:=(['"]?)(.*?)\2])?/g,
function () { console.log(arguments[1], arguments[3]); })
这将产生"short-name, shorty", "long-name longy", "longest undefined"
答案 1 :(得分:0)
让第二部分是可选的。 放一些空格以便最佳观看。
"[@short-name]".match(/\[\@(.*) (\=\'(.*)\')? \]/)
用括号括起代码并添加?
就可以了。
http://metahtml.sourceforge.net/documentation/regex/regex_3.mhtml#SEC14