【问题标题】:REGEX to find STRING between two values正则表达式查找两个值之间的字符串
【发布时间】:2013-10-24 09:13:23
【问题描述】:

我从监控系统接收到一个字符串,该字符串包含 3 个我感兴趣的变量,这些变量是 pre/post fixedc=VAR1; e=VAR2; s=VAR3; 所以我想获取文本例如 c= 之间;但成功有限,以下是我测试过的一些 REGEX:

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

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

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

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

非常感谢任何帮助。

谢谢!

【问题讨论】:

    标签: regex string substring


    【解决方案1】:

    你可以使用类似的东西:

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

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

    c=([^;]+)
    

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

    【讨论】:

    • @Isaac:糟糕,错字。是的,忘记量词了。很好的收获。
    • @Isaac:哈哈,确实。你能说是5点之后吗? ;p
    • 这似乎应该做我需要的事情,当我在 REGEX 测试器中运行它时,它会找到我需要的东西,但它在我用于这项工作的本机工具中不起作用,但这就是不是你的问题,所以谢谢你的回答!
    • @AndrewReynolds:应用程序在哪里? REGEX 有不同的版本和应用程序。不幸的是,没有“一刀切”,尽管 90% 的模式可以跨平台/应用程序翻译。
    【解决方案2】:

    试试这样的,

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

    Lookahead and Lookbehind Zero-Width Assertions

    RegexBuddy 截图

    【讨论】:

    • 所以这个给了我:REGEX: Compile failed at offset 18: lookbehind assertion is not fixed length as a error in my debugger
    【解决方案3】:

    您的第一个正则表达式很好,但仅适用于 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
    }
    

    更新:在 cmets 中回答 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

    【讨论】:

    • 关于这个的问题 - 一次性完成它们是否允许我将它们分配给单独的变量?或者它只会找到第一个,我在你的 PHP 中看到你有一个 FOR 循环计数器,所以我认为这就是你分配它们的方式,但是在我用于工作的本机工具中,我不可能拥有3 个变量都在同一字符串上运行略有不同的 REGEX,以挑选出它感兴趣的文本。
    • 我更新了我的答案以包含您关于 FOR 循环的问题,如果您觉得它有用,请考虑放弃投票 :-)
    【解决方案4】:

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

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

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

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多