在两个值之间查找字符串的正则表达式

3

我收到了来自监控系统的字符串,其中包含3个变量,我对这些变量很感兴趣,这些变量被c=VAR1;e=VAR2;s=VAR3;所包围,所以我想获取它们之间的文本,例如c=,但是我的尝试有限,以下是我测试过的一些正则表达式:

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

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

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

但是没有一个返回的结果符合我的预期。
非常感谢任何帮助。
谢谢!
4个回答

1

您可以使用类似以下的内容:

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

这将获取所有值(键和值),但如果您只需要 c 值:

c=([^;]+)

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


@Isaac:糟糕,打错字了。是的,忘记了量词。发现得好。 - Brad Christie
@Isaac:哈哈,确实。你能看出现在已经过了5点了吗?;p - Brad Christie
这似乎可以满足我的需求,而且当我在 REGEX 测试器中运行它时,它能找到我需要的内容,但是它在我的本地工具中无法正常工作,不过这不是你的问题,所以谢谢你的答案! - Andrew Reynolds
@AndrewReynolds:应用程序在哪里?REGEX 有不同的版本和应用程序。不幸的是,没有“一刀切”的解决方案,尽管90%的模式可以跨平台/应用程序进行转换。 - Brad Christie

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 变量变量


关于这个问题 - 如果一次性完成它们,我能否将它们分配给单独的变量?还是它只会找到第一个,我看你的PHP中有一个FOR循环计数器,所以我假设这是你如何分配每个变量的,但在我用于工作的本地工具中,这是不可能的。我有3个变量,它们都在同一个字符串上运行略微不同的REGEX,以挑选出它感兴趣的文本。 - Andrew Reynolds
我更新了我的回答,包括你关于FOR循环的问题,请考虑给予赞赏,如果你觉得它有用的话 :-) - Nelson

0

所以这个给了我一个错误,我的调试器显示:REGEX: Compile failed at offset 18: lookbehind assertion is not fixed length。 - Andrew Reynolds

0
所以这个问题的最终解决方案是我需要对我正在使用的工具进行更深入的了解,特别是正则表达式引擎...结果发现它使用的是 PCRE,所以最终的正则表达式是:
'(?<=c=)[^;]*'
'(?<=e=)[^;]*'
'(?<=s=)[^;]*'

在我重新配置的软件中存在的工具中,它提供了三个变量,使我能够正确解释我的监控系统警报。谢谢大家!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接