2011-03-24 77 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 
    ) 
相关问题