我有这样的字符串
Start the function "function name" (any words here ie .*) (0x10)
或'Lets start function "function name" (any words here ie .*) (0x0B)
等等.. function "function name" will start (any words here ie .*) (0x0C).
实际上,我需要一个正则表达式,该字符串在字符串中按特定顺序匹配Start
和function
个字符,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)\).*$
答案 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。如果您需要,也许其他人可以提供帮助。但是,至少,你得到了一般的想法。
修改:在.*
"