0

正規表現を使用して複数の文字列をキャプチャする次の行があります。

l = '15                 1180       62444    e0e0                   049c     f3ec      104';

この行で動作するように、次の正規表現を拡張していました。

d = regexpi(l, '([0-9a-f]+)\s?', 'tokens');

この行を実行すると、それが得られlength(d) == 7ます。正規表現は最初に出現したもの、つまりlength(d) == 1andのみに一致するべきではありませんd{1} == '15'か?

価値のあることとして、Perl で同じ正規表現を使用したところ、パターンの最初のインスタンスのみに一致することがわかりました (これは私が予想したことです)。

my $l = ... #defined above already
$l =~ m/([0-9a-f]+)\s?/i;

if (! defined($2)){ # $2, $3, ..., $n will be defined for n matches
    print "Didn't match twice!\n"; # this prints when I execute the script
}
4

2 に答える 2

2

使用で述べたようにregexpi...

start = regexpi(str,expr)大文字と小文字に関係なく、正規表現文字列 expr に一致する str 内の部分文字列のインデックスを含む行ベクトル start を返します。

str または expr が文字列のセル配列の場合、regexpi はインデックスの行ベクトルの m 行 n 列のセル配列を返します。ここで、m は str 内の文字列の数、n は expr 内の正規表現パターンの数です。

[start,finish] = regexpi(str,expr)start の対応する部分文字列の最後の文字のインデックスを含む、追加の行ベクトル finish を返します。

[start,finish,tokens] = regexpi(str,expr)start と finish の対応する部分文字列内のトークンの開始インデックスと終了インデックスの 1 行 n 列の cell 配列 tokens を返します。トークンは、式 expr 内の括弧で示されます。

[...] = regexpi(str,expr,'once')最初の一致のみを検索します。(デフォルトでは、regexp はすべての一致を返します。) 一致が見つからない場合、すべての戻り値は空です。

于 2013-09-03T21:06:40.880 に答える