2 つの短い文字列 (サイズが 1x10 の S) と非常に長い文字列 (サイズが 1x1000 の L) があり、S と一致する L の位置を見つけます。
この特定のマッチングでは、S 内の特定の文字列 (黒い文字列) と一致することに関心があります。特定の文字列 (たとえば、S の 1、5、9 の文字列番号) に一致する関数またはメソッドが matlab にありますか?
2 つの短い文字列 (サイズが 1x10 の S) と非常に長い文字列 (サイズが 1x1000 の L) があり、S と一致する L の位置を見つけます。
この特定のマッチングでは、S 内の特定の文字列 (黒い文字列) と一致することに関心があります。特定の文字列 (たとえば、S の 1、5、9 の文字列番号) に一致する関数またはメソッドが matlab にありますか?
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
正しいようです。