2013-04-17 75 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