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 上做一个回顾.*,我正在尝试这样的事情(顺便说一句,没有命名组)。

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

我正在使用 Gskinner 的RegExr引擎来尝试我的正则表达式,我也尝试了很多其他变体,但直到现在都没有成功......

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

4

3 回答 3

4

正如stema 在评论中所说,在.NET 之外的所有正则表达式引擎中,lookbehinds 必须是固定长度(或至少是有限长度)。也[(?<!\\),}]没有什么真正的意思。它只匹配方括号内的任何字符。您可以反转您的尝试并使用除未转义的逗号和右大括号之外的任何内容:

([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

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

请注意,PHPpreg_match_all将以与您需要的结构略有不同的结构返回数组(但很容易根据您的需要进行转换)。此外,在 PHP 字符串中,您不会绕过所有反斜杠的双重转义,因此每次都会有四个。喜欢:

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

工作演示。

另请注意,在大多数情况下,无法超过您想要匹配的内容末尾的贪婪模式比试图找到第一个被禁止的非贪婪解决方案更有效。

于 2013-04-17T13:57:13.007 回答
0

像这样的东西: http ://rubular.com/r/XLI9euNcL5

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

于 2013-04-17T14:05:25.947 回答
0

.* 是贪婪的并阻止了比赛。尝试

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

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

于 2013-04-17T13:52:43.503 回答