正则表达式的字符串,直到转义逗号
问题描述:
我有以下字符串:正则表达式的字符串,直到转义逗号
{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脚本。当然,我不介意完全重建上述正则表达式,尽管我想将它保持在正则表达式级别。如果不是为了速度,那么只是为了正则表达式的教育目的。
答
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_]*)=((?:[^\\\\,}]|\\\\.)*)/';
还要注意的是贪婪的模式,不能走过去的,你要匹配,在大多数情况下比非贪婪的解决方案更有效的东西到底是试图找到第一件事被禁止。
我相信''是贪婪的,这将导致你不能看它背后。 –
我有这样的想法,那就是问题所在。有没有其他的正则表达式来获得上述结果? – Ambidex
在php lookbehinds中不允许使用量词,只有.net支持无限长的lookbehinds。 – stema