2

我有类似的东西:

[@parameter='value']

[@parameter]

我需要正则表达式来解析这两种情况,首先在第二个参数中返回参数和值

现在,我有类似的东西

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

如果可以更容易地做到这一点,请告诉我如何

4

2 回答 2

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"

于 2013-02-22T17:31:40.660 回答
0

让第二部分是可选的。放置一些空间以获得最佳视野。

"[@short-name]".match(/\[\@(.*)   (\=\'(.*)\')?    \]/)

用括号包装代码并添加 a?就可以了。 http://metahtml.sourceforge.net/documentation/regex/regex_3.mhtml#SEC14

于 2013-02-22T17:27:44.220 回答