我有一个类似的字符串:
prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4::
我想检索与键相关联的值(例如,key1)。以下模式:
::key1==([^:]*)
...只有在值中没有“:
”字符时才会起作用,所以我想确保模式匹配仅针对子字符串::
停止,但我是找不到怎么做,因为我看到的大多数例子都是单字符匹配。
如何修改正则表达式模式以匹配“::key1==
”与下一个“::
”之间的所有字符?
谢谢!
答案 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
)