2011-03-24 43 views
1

我有一個字符串,它是這樣的:正則表達式模式來捕捉圍繞兩個字符分隔符

prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4:: 

我想要檢索關聯到一個鍵的值(比如,KEY1)。以下模式:

::key1==([^:]*) 

...只要有在值中沒有「:」字,所以我要確保模式匹配只會停供子::,但我會努力找不到如何做到這一點,因爲我看到的大多數例子都是關於單個字符匹配的。

如何修改正則表達式模式以匹配「::key1==」和下一個「::」之間的所有字符?

謝謝!

+3

不知道你正在使用,但例如瓦特/ PHP的,任何原因,你不能只用「::」作爲分隔符,而不是爆炸()用什麼語言? – 2011-03-24 17:57:29

回答

2

你能做這樣的事情:::key1==(.*?)::?假設語言支持懶惰的?運算符,這應該工作。

+0

如果支持'?',這應該確實有效。 您可以隨時使用http://www.regexpal.com來測試正則表達式匹配功能。 – Eli 2011-03-24 18:06:28

2

我認爲你正在尋找一個積極前瞻:

::key0==(.*?)(?=::\w+==) 

下列要求:

prefix::key0==val::ue0::key1==value1::key2==value2::key3==value3::key4==value4:: 

它正確地發現VAL :: UE0。這還假定按鍵符合\ W([0-9A-ZA-Z_])

此外,積極的前瞻可能有點矯枉過正,但如果答案包含::會的工作,太。

2

正如我在你的問題發表評論時提及,如果你的字符串的全部是

prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4:: 

我建議爆炸/在::而不是使用正則表達式,因爲它通常總是更快分割字符串。您沒有指定的語言,但這裏是一個PHP的例子:

// string 
$string = "prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4::"; 
// explode using :: as delimiter 
$string = explode('::',$string); 
// for each element... 
foreach ($string as $value) { 
    // check if it has == in it 
    if (strpos($value,'==')!==false) $matches[] = $value; 
} 
// output 
echo "<pre>";print_r($matches); 

輸出:

Array 
(
    [0] => key0==value0 
    [1] => key1==value1 
    [2] => key2==value2 
    [3] => key3==value3 
    [4] => key4==value4 
) 

但是,如果你堅持的正則表達式的方法,這裏的負先行替代

::((?:(?!::).)+) 

php示例

// string 
$string = "prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4::"; 
preg_match_all('~::((?:(?!::).)+)~',$string,$matches); 
//output 
echo "<pre>";print_r($matches); 

輸出

Array 
    (
     [0] => key0==value0 
     [1] => key1==value1 
     [2] => key2==value2 
     [3] => key3==value3 
     [4] => key4==value4 
    )