-1

我有这样的字符串

  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).

实际上,我需要一个正则表达式来匹配字符串中特定顺序Startfunction单词,而不需要Start单词应该在行首,string2
Start应该是第一次出现,function单词应该是第二个,无论它们在字符串中的位置如何。

上面的第三个字符串将不匹配,因为Startword 在 word 之后function。如果 Reg ex 匹配,那么我需要捕获"function name"iestring inside double quotes(0x10)ie hex valuesinside ()

我尝试了以下没有帮助的正则表达式

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

4

3 回答 3

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";
}
于 2012-04-09T12:13:40.373 回答
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
于 2012-04-09T12:53:42.367 回答
0

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

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

而且,如果您使用查找功能而不是匹配项,则可能可以跳过开头和结尾的 .* ..

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

编辑:忘记.*之前"

于 2012-04-09T12:07:59.503 回答