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

実際には、一致する正規表現が必要であり、文字列内の特定の順序で単語が行頭にある必要はありませんStart。つまり 、文字列内の配置に関係なく 、単語が最初に出現し、単語が 2 番目にある必要があります。functionStartstring2
Startfunction

上記の 3 番目の文字列はStart、 word が word の後に来るため、一致しませんfunction。正規表現が一致する場合は、"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 に答える