-1

2 つの短い文字列 (サイズが 1x10 の S) と非常に長い文字列 (サイズが 1x1000 の L) があり、S と一致する L の位置を見つけます。

ここに画像の説明を入力

この特定のマッチングでは、S 内の特定の文字列 (黒い文字列) と一致することに関心があります。特定の文字列 (たとえば、S の 1、5、9 の文字列番号) に一致する関数またはメソッドが matlab にありますか?

4

1 に答える 1

1

L私があなたの質問を正しく理解していれば、特定の位置と同じ文字 (文字) を含む部分文字列を見つけたいと考えていますS( array によって与えられたとしましょうidx)。ここでは正規表現が理想的ですregexp

正規表現では、ドット ( .) は任意の文字に一致し、中括弧 ( {}) は必要に応じて出現回数を指定します。たとえば、2 番目の文字が 'a' で 5 番目の文字が 'b' である長さ 6 の文字列に一致する場合、正規表現は次の構文のいずれかになります。

.a..b.
.a.{2}b.
.{1}a.{2}b.{1}

これらのいずれかが正しいです。それでは、最初に正規表現パターンを作成しましょう。

in = num2cell(diff([0; idx(:); numel(S) + 1]) - 1);  %// Intervals
ch = num2cell(S(idx(:)));                            %// Matched characters
C = [in(:)'; ch(:)', {''}];
pat = sprintf('.{%d}%c', C{:});                      %// Pattern for regexp

あとは、必要なパターンをフィードregexpするだけです。L

loc = regexp(L, pat)

そして出来上がり!

次のように仮定します。

S = 'wbzder'
L = 'gabcdexybhdef'
idx = [2 4 5]

まず、パターンを作成します。

in = num2cell(diff([0; idx(:); numel(S) + 1]) - 1);
ch = num2cell(S(idx(:)));
C = [in(:)'; ch(:)', {''}];
pat = sprintf('.{%d}%c', C{:});

得られるパターンは次のとおりです。

pat =
    .{1}b.{1}d.{0}e.{1}

明らかに、このパターンを美化するコードを に追加できます.b.de.が、これは実際には不要な最適化です (regexp前者も同様に処理できます)。

実行後:

loc = regexp(L, pat)

次の結果が得られます。

loc =
     2     8

正しいようです。

于 2013-04-02T17:31:34.863 に答える