正则表达式匹配包含两个单词的字符串

时间:2012-04-09 11:50:03

标签: regex perl

我有这样的字符串

  1. Start the function "function name" (any words here ie .*) (0x10)
  2. 'Lets start function "function name" (any words here ie .*) (0x0B)等等..
  3. function "function name" will start (any words here ie .*) (0x0C).
  4. 实际上,我需要一个正则表达式,该字符串在字符串中按特定顺序匹配Startfunction个字符,Start字应该位于该行的开头string2 {1}}
    Start应该是第一次出现,而function字应该是第二次,而不管它们在字符串中的位置。

    上面的第三个字符串将不匹配,因为Start字词位于单词function之后。如果Reg ex匹配,那么我需要在"function name"内捕获string inside double quotes(0x10)ie hex values()

    我尝试了以下正常用法无效

    ^(?=.*\bStart\b)(?=.*\bfunction\b)"(.*?)".*\((\b0[xX][0-9a-fA-F]+\b)\).*$

3 个答案:

答案 0 :(得分:1)

#!/usr/bin/env perl

use strict; use warnings;

my @s = (
    'Start the function "function name" with (0x10)',
    'Lets start function "function name" with (0x0B)',
    'function "function name" will start with (0x0C)',
    'Start function "API"tovalue:"Enabled"(0x01)',
);

for my $s (@s) {

    my ($f, $h) = ($s =~ m{
            [Ss]tart
            [ ]
            .*?
            function
            [ ]
            "( [^"]+ )"
            [^(]+
            [(]
            ( 0x[[:xdigit:]]+ )
            [)]
        }x
    ) or next;

    print "Function name: '$f'. Hex value: '$h'\n";
}

答案 1 :(得分:1)

我认为分离字符串验证和字段提取更清楚。

这个程序显示了我的观点

use strict;
use warnings;

my @data = (
  'Start the function "function_one" with (0x10)',
  'Lets start function "function_two" with (0x0B)',
  'function "function_three" will start with (0x0C)',
);

for (@data) {
  next unless /\bstart\b.*\bfunction\b/i;
  printf "%s %s\n", $1, $2 if /"(.*?)".*\(0x([0-9a-f]+)\)/i;
}

<强>输出

function_one 10
function_two 0B

答案 2 :(得分:0)

我会简化。你不需要前瞻。

.*\bStart\b.*\bfunction\b.*"(.*?)".*\((0[xX][0-9a-fA-F]+)\).*

如果你使用find函数而不是匹配,你可以在开头和结尾跳过。*。

那就是说,我不熟悉Perl所以我不确定我发布了什么作品或者如何在Perl中使用find。如果您需要,也许其他人可以提供帮助。但是,至少,你得到了一般的想法。

修改:在.*

之前忘记"