jQuery正则表达式匹配帮助(可选条件)

时间:2013-02-22 17:22:30

标签: javascript regex

我有类似的东西:

[@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]+)(\[@([^=\]]*)(?:='(.*)'])?)?/

如果可以更轻松地完成,请告诉我如何

2 个答案:

答案 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