空のエントリを含んだ文字列をフィルタ処理する方法
 
 
 

MAXScript に関する質問と回答 > MAXScript 値の操作 > 空のエントリを含んだ文字列をフィルタ処理する方法

注:

3ds Max 8 以降では、キーワード パラメータ splitEmptyTokens:filterString 関数に渡され、この種類のフィルタリングが実行されます。

質問:

filterString 関数は、空のエントリを返しません。たとえば、1行に 2 つのタブを含んだ文字列を、タブを使用してフィルタリングする場合、空のエントリは返されません。

例:

filterString "One¥t¥tThree Four,,Five ""¥t, " #("One", "Three", "Four", "Five")

回答:

次のスクリプト関数で目的の処理を行えます。

スクリプト関数:

fn filterString2 theString theDelimiters =
(
 theTokens = #() --返されるトークンの配列
 ready = false
 while not ready do --区切り記号が見つからなくなるまで繰り返します。
 (
  ready = true --終了したことを示すフラグを立てます。
  thePosArray = #() -- 区切り位置を保持する整数の配列の初期化
  for i = 1 to theDelimiters.count do --すべての区切り文字に対して繰り返します。
  (
   checkPos = findString theString theDelimiters[i] --文字列に区切り文字があるかどうかを調べます。
   if checkPos != undefined do append thePosArray checkPos --ある場合、区切り位置配列に追加します。
  ) --i ループを終了
  if thePosArray.count > 0 then --配列に区切り位置がある場合
  (
   sort thePosArray --配列を昇順にソートします
   checkPos = thePosArray[1] --最初の位置を取り込みます
   aToken = substring theString 1 (checkPos-1) --開始点から区切り位置 - 1 
   append theTokens aToken --までをトークンにします
   theString = substring theString (checkPos+1) theString.count --文字列からトークンと区切り文字を削除します
   ready = false --まだ終了していないのでフラグを降ろします
  ) --if 終了
 ) --while ループ終了
 append theTokens theString --残っている文字列を配列に追加します
 theTokens --トークンの配列を返します
)
filterString2 "One\t\tThree,Four,,Five " "\t,"
#("One", "", "Three", "Four", "", "Five ")
filterString2 "One\t\tThree Four,,Five " "\t, "
#("One", "", "Three", "Four", "", "Five", "")
関連事項