3

我有一个从监控系统接收到的字符串,该字符串包含 3 个我感兴趣的变量,这些变量是预先/后固定的,c=VAR1; e=VAR2; s=VAR3;所以我想抓取中间的文本,例如c= ; 但我的成功有限,这些是我测试过的一些正则表达式:

c=([^;]+);
.+c=(.+);.+
(?<=c=\()(.*?)(?=\;*\))
c=(.*);

完整的警报字符串类似于:

alert c=Vari Able1; e=Vari Able2; s=Vari Able3;

但似乎没有人以我期望的方式返回。

任何帮助深表感谢。

谢谢!

4

4 回答 4

1

你可以使用类似的东西:

(\w+)=([^;]+)

这将获取所有值(键和值),但如果你只追求 c 值:

c=([^;]+)

应该捕获=和之间的所有内容;([^;]+)捕获不是分号的每个字符,重复1次或更多次。)。

于 2012-09-25T21:46:26.047 回答
0

所以这个问题的最终解决方案是我需要更多地了解我正在使用的工具,特别是 REGEX 引擎......因为它使用 PCRE 所以最终的 REGEX 是:

'(?<=c=)[^;]*'
'(?<=e=)[^;]*'
'(?<=s=)[^;]*'

在我正在重新配置的软件中存在的工具中,这给了我正确解释监视器系统警报所需的三个变量。

谢谢大家!

于 2012-09-26T18:50:41.223 回答
0

试试这样的,

(?<=((alert)?.*=)).*?(?=;)

请参阅Lookahead 和 Lookbehind 零宽度断言

正则表达式好友截图

在此处输入图像描述

于 2012-09-26T03:52:24.460 回答
0

您的第一个正则表达式很好,但仅适用于c变量,这是适用于所有三个变量的变体:

[ces]=([^;]+);

这将查找您的 c 、 e 和 s 变量。

PHP中,您可以像这样执行它:

$string = 'c=VAR1; e=VAR2; s=VAR3;';
preg_match_all("/([ces])=([^;]+);/", $string, $out, PREG_PATTERN_ORDER);
$tot = count($out[1]);
for ($i=0;$i<$tot;$i++) {
    echo $out[1][$i]; //will echo 'c' , 'e' , 's' respectively
    echo $out[2][$i]; //will echo 'VAR1' , 'VAR2' , 'VAR3' respectively
}

更新:在评论中回答 OP 的问题

上面的循环用于动态分配找到的值,因此如果正则表达式找到 4 、 5 或 10 个变量,则 for 将循环所有这些值。但是,如果您确定您的字符串中只有 3 个变量,您可以一次性直接分配它们,如下所示:

$string = 'c=VAR1; e=VAR2; s=VAR3;';
preg_match_all("/([ces])=([^;]+);/", $string, $out, PREG_PATTERN_ORDER);
$$out[1][0] = $out[2][0]; // var $c is created with VAR1 value
$$out[1][1] = $out[2][1]; // var $e is created with VAR1 value
$$out[1][2] = $out[2][2]; // var $s is created with VAR1 value

echo $c; //will output VAR1
echo $e; //will output VAR2
echo $s; //will output VAR3

我在上面的代码中使用 PHP变量变量。

于 2012-09-25T21:53:00.650 回答