2013-04-17 81 views
0

我有以下字符串:正则表达式的字符串,直到转义逗号

{lorum=Vestibulum id ligula porta felis euismod semper. Sed posuere\, consectetur est at lobortis.,ipsum= Cras mattis consectetur purus sit amet fermentum. Nulla vitae elit libero, a pharetra augue.} 

现在,我想的是:

array (
    array( 
     'operator' => 'lorum', 
     'value' => 'Vestibulum id ligula porta felis euismod semper. Sed posuere\, consectetur est at lobortis.' 
    ), 
    array(
     'operator' => 'ipsum', 
     'value' => 'Cras mattis consectetur purus sit amet fermentum. Nulla vitae elit libero, a pharetra augue.' 
    ) 
) 

最大的问题是,我不能让我的正则表达式在.*上做一个后台,我正在尝试这样的事情(没有命名的组,但顺便说一句)。

[{,]?([a-zA-Z_]*)=((?<!\\).*)[(?<!\\),}] 

我使用的是RegExr引擎从Gskinner试试我正则表达式的,我也尝试了很多其他的变化,但非成功到现在......

最终,这个表达式应该使用一个PHP脚本。当然,我不介意完全重建上述正则表达式,尽管我想将它保持在正则表达式级别。如果不是为了速度,那么只是为了正则表达式的教育目的。

+0

我相信''是贪婪的,这将导致你不能看它背后。 –

+0

我有这样的想法,那就是问题所在。有没有其他的正则表达式来获得上述结果? – Ambidex

+3

在php lookbehinds中不允许使用量词,只有.net支持无限长的lookbehinds。 – stema

回答

4

STEMA作为一个评论说,lookbehinds必须在.NET之外的所有正则表达式引擎固定长度(或至少有限的长度)的。另外[(?<!\\),}]并不意味着什么。它只是匹配方括号内的任何字符。你可以扭转你的尝试和消费但不包括那些没有逃过逗号和花括号什么:

([a-zA-Z_]*)=((?:[^\\,}]|\\.)*) 

在自由空间模式与一些解释:

([a-zA-Z_]*)= # match and capture the key (as in your own regex) 
(    # capture the value 
    (?:   # non-capturing group for allowed sequences for the value 
    [^\\,}]  # any character except backslash, comma and closing brace 
    |    # OR 
    \\.   # a backslash followed by anything 
) 
    *    # repeat as long as possible 
)    # end of capturing group 

注意,这允许任何字符转义(包括其他反斜杠和闭合括号)。

请注意,PHP的preg_match_all将返回与您需要的结构略有不同的结构(但它很容易转移到您的需要)。另外,在一个PHP字符串中,你不会绕过所有反斜杠,所以你每次都会有四个反斜杠。像:

$pattern = '/([a-zA-Z_]*)=((?:[^\\\\,}]|\\\\.)*)/'; 

Working demo.

还要注意的是贪婪的模式,不能走过去的,你要匹配,在大多数情况下比非贪婪的解决方案更有效的东西到底是试图找到第一件事被禁止。

+0

这似乎有窍门!非常感谢!你可以通过划线来澄清那个正则表达式的工作流程吗?标记为答案! – Ambidex

+0

@Ambidex你的意思是我已经编辑过它的方式吗? –

+0

是啊!当我刷新页面时,它神奇地出现了。 ;) 非常感谢! – Ambidex

0

*。正在贪婪并阻止匹配。尝试

[{,]?([a-zA-Z_]*?)=((?<!\\).*?)[(?<!\\),}]

Rubular:http://rubular.com/r/l8R3GCmalw

+0

我认为这会排除沿途逃离逗号的最后一部分价值。我认为这个缺陷来源于我原来的正则表达式,这将由我撰写。虽然,我不确定为什么会发生这种情况。 – Ambidex