9

文字列からハイフン(-)、スラッシュ(/)、空白( )を削除して、構造フィールド名として使用できるようにします。name(i)

これは私が現在関数を使用してそれを行っている醜い方法ですstrrep

cell2mat(strrep(strrep(strrep(name(i), '-',''),'/',''),' ', ''))

次のような他のバリエーションも試しました。

strrep(name(i),{'-','/'},{'',''});
strrep(name(i),['-','/'],['','']);

これを行うためのより効率的な方法は何ですか?

4

4 に答える 4

10

注:変数nameは文字列のセル配列だと思います。その場合、変数から文字列を取得するには、 (つまりセルインデックス)の代わりに{}(つまりコンテンツインデックス)を使用する必要があります...()

MATLABの多くの問題と同様に、これを解決する方法はいくつかあります...


オプション1:関数REGEXPREPを使用できます。以下は、ハイフン、スラッシュ、および空白を削除します。

newName = regexprep(name{i},'[-/\s]','');

ここでの利点は、すべての\s空白文字に一致して置き換えられることです。これには、通常のスペース(ASCIIコード32)だけでなく、タブ、改行なども含まれます。

安全を確保し、 MATLAB変数/フィールド名で無効なすべての文字を削除したい場合は、上記を次のように簡略化できます。

newName = regexprep(name{i},'\W','');


オプション2:リストした3文字以外のものを削除することを心配する必要がない場合は、次のように関数ISMEMBERを使用できます。

newName = name{i};
newName(ismember(newName,'-/ ')) = [];


オプション3:英数字であるすべてのものを保持し、残り(ハイフン、空白、アンダースコアなど)をダンプしたい場合は、関数ISTSTRPROPを使用できます。

newName = name{i};
newName = newName(isstrprop(newName,'alphanum'));
于 2010-11-16T18:42:45.733 に答える
6

最も簡単な方法は、組み込み関数genvarnameを使用することです。名前は見栄えが悪くなりますが、有効な名前であることが保証されており、元の一意性が保持されます。

特定の文字を削除したいだけの場合は、regexprepを使用できます。

regexprep('foo- /foo- /foo', '[- \/]', '')
于 2010-11-16T18:48:20.493 に答える
0

文字列は単なる配列なので、次のようなことができます。

name(name == '-' | name == '/' | name = ' ') = [];

全体的な目標に関しては、構造体名に無効な文字が他にもたくさんあります。許可される文字のセットを定義し、そのセットに含まれていないものをすべて削除することに賭けます。

例えば:

function i = isAllowed(str)

i = (str >= '0' & str <= '9') ...
  | (str >= 'a' & str <= 'z') ...
  | (str >= 'A' & str <= 'Z');


...

name(~isAllowed(name)) = [];
于 2010-11-16T18:44:18.737 に答える
0

別の解決策は次のとおりです。

name = 'some/path/file-name ext';    %# sample string
blacklist = {'-' '/' ' '};           %# list of character not allowed

idx = cell2mat( cellfun(@(c)strfind(name,c), blacklist, 'UniformOutput',false) );
name(idx) = '_';                    %# you can remove/replace those locations

>> name
 name =
 some_path_file_name_ext
于 2010-11-16T20:03:51.067 に答える