0

我必须在asd["]"]里面匹配asd["]"] asd

我使用正则表达式:

/([a-z]+?(\[[^,\]]*?\]|\[\".*\"\]))/u

但它给了我asd["]

如果我在正则表达式中更改 OR 元素的顺序:

/([a-z]+?(\[\".*\"\]|\[[^,\]]*?\]))/u

我可以得到想要的结果,但我相信这样一些其他情况是行不通的。这是我的正则表达式的缩小版本。

我怎么能指向正则表达式来选择最长的匹配(贪婪)?

编辑:

使用正则表达式:

/{((\"a\")|([^b]*)})/u

我明白了

{c {"a"}

{b{c {"a"} b}

在这种情况下,正则表达式选择了比第一个更长的第二个 OR 语句。

4

2 回答 2

0

出于某种原因,在您的两个替代方案中,您使一个不需要它的不贪心,而留下一个实际上需要不贪心的贪心。要使用正则表达式解决您的问题(尽管它会有一些警告),您可能应该在任何情况下使用否定字符类:

'/([a-z]+?)\[([^"\[\]]*|"[^"]*")\]/'

对于您给定的示例,这应该可以正常工作。它会找到最里面的asd[something here]or asd["something with [][] here"]

我说的是注意事项。对于未引用的情况,这找不到嵌套的事件。asd[b efg[something]]它将匹配而efg[something]不是外部括号。但是,即使可以,您也会失去内部匹配,因为匹配不能重叠。如果您希望找到最外面的有效括号(因此只有给定示例中的完整字符串),您应该查看 PCRE 的递归功能。请注意,您必须决定最内层或最外层。也preg_match不会preg_match_all找到你所有的嵌套匹配。

于 2012-11-14T10:06:44.413 回答
0

这个正则表达式似乎对我有用:

/([a-z]+(\[[^,]*\]|\[\".*\"\]))/

在其中,我只是删除了原始正则表达式 [^,\]] 部分中的 \],并删除了所有非贪婪通配符,尽管它们似乎无论如何都没有效果。
如果您正在寻找嵌套结构,则寻找“非关闭符号”永远不会找到您最长的匹配项,因为它总是会在第一个(最里面的)关闭字符处停止,因此您必须选择外壳内唯一的其他东西.

于 2014-03-05T23:05:40.677 回答