RegEx模式捕获大约两个字符的分隔符

时间:2011-03-24 17:55:18

标签: regex

我有一个类似的字符串:

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

我想检索与键相关联的值(例如,key1)。以下模式:

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

...只有在值中没有“:”字符时才会起作用,所以我想确保模式匹配仅针对子字符串::停止,但我是找不到怎么做,因为我看到的大多数例子都是单字符匹配。

如何修改正则表达式模式以匹配“::key1==”与下一个“::”之间的所有字符?

谢谢!

3 个答案:

答案 0 :(得分:2)

你可以这样做:::key1==(.*?)::?假设该语言支持惰性?运算符,这应该可以工作。

答案 1 :(得分:2)

我认为你正在寻找积极的展望:

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

以下内容:

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

它正确找到 val :: ue0 。这也假设键符合 \ w ([0-9A-Za-z _])

此外,积极的预测可能有点过分,但如果答案也包含::,则会有效。

答案 2 :(得分: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
    )