我有一个从监控系统收到的字符串,该字符串包含3个变量,我感兴趣的变量是预先/后固定与c=VAR1; e=VAR2; s=VAR3;
所以我想抓住中间的文本例如 c = ;但是我的成功有限,这些是我测试过的一些REGEX:
c=([^;]+);
.+c=(.+);.+
(?<=c=\()(.*?)(?=\;*\))
c=(.*);
完整警报字符串看起来类似于:
alert c=Vari Able1; e=Vari Able2; s=Vari Able3;
但似乎没有一种方式像我期望的那样回归。
非常感谢任何帮助。
谢谢!
答案 0 :(得分:1)
您可以使用以下内容:
(\w+)=([^;]+)
哪个会获取所有值(键和值),但是如果你只追求c值:
c=([^;]+)
应捕获=
和;
之间的所有内容(([^;]+)
捕获每个不是分号的字符,重复1次或更多次。)。
答案 1 :(得分: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 variable variables。
答案 2 :(得分:0)
尝试这样的事情,
(?<=((alert)?.*=)).*?(?=;)
请参阅 Lookahead and Lookbehind Zero-Width Assertions 。
RegexBuddy ScreenShot
答案 3 :(得分:0)
所以这个问题的最终解决方案是我需要找到更多关于我正在使用的工具,特别是REGEX引擎...因为事实证明它使用PCRE所以最终的REGEX是:
'(?<=c=)[^;]*'
'(?<=e=)[^;]*'
'(?<=s=)[^;]*'
在我正在重新配置的软件中存在的工具中,这给了我正确解释我的监控系统警报所需的三个变量。
全部谢谢!