LlSubStringIndex/ja

From Second Life Wiki
< LlSubStringIndex
Revision as of 04:24, 12 April 2010 by Mako Nozaki (talk | contribs) (Undo revision 852002 by Mako Nozaki (Talk))
Jump to navigation Jump to search

要約

関数: integer llSubStringIndex( string source, string pattern );

source において pattern が最初に見つかる位置が先頭から何文字目かを integer で返します。

• string source
• string pattern

patternsource に無かった場合、-1 が返されます。
先頭文字は 0 文字目です。
全角文字も 1 文字として数えます。

警告

  • マッチングでは大文字/小文字、全角/半角を区別します。
    • ワイルドカードや正規表現は使えません。
  • pattern を空文字列 ("") にした場合、-1 でなく 0 が戻ります。
  • source の末尾から先頭方向へ検索したり、特定の位置から検索を開始する関数はありません。

サンプル

姓に関するマッチング: <lsl> default {

   state_entry()
   {
       llSensorRepeat("", NULL_KEY, AGENT, PI, 96.0, 20);
   }
   
   sensor(integer NumDet)
   {
       integer i;
       
       //検知されたアバター名を順に " Linden" とマッチングさせる。
       //これは Linden という姓とのマッチングになる。(なぜなら名の先頭にスペースは入らないから。)
       //逆に名とマッチングするならば "FirstName " とマッチングさせる。
       for(i = 0; i < NumDet; ++i)
           if(~llSubStringIndex(llDetectedName(i), " Linden"))
               llInstantMessage(llDetectedKey(i), "Hello, I see you!");
   }

} </lsl>

基本的な例: <lsl>integer index = llSubStringIndex("string data","TEST"); if(index == -1) {

   llSay(0,"TEST という語は文字列中に見つかりませんでした。");

} else {

   llSay(0,"TEST という語が文字列中に見つかりました。");
}</lsl>

便利なスニペット

ある文字列が、特定のキーワードを含んでいるか調べる:

1. 簡潔かつ通常の手法:

<lsl> // haystack に needle が含まれていたら 1 を、含まれていないならば 0 を返す。 integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

   return 0 <= llSubStringIndex(haystack, needle);

} </lsl>

<lsl> // haystack の先頭が needle だったならば 1 を、そうでないならば 0 を返す。 integer startswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

   return llDeleteSubString(haystack, llStringLength(needle), -1) == needle;

} </lsl>

<lsl> // haystack の末尾が needle だったならば 1 を、そうでないならば 0 を返す。 integer endswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

   return llDeleteSubString(haystack, 0, ~llStringLength(needle)) == needle;

} </lsl>

註: 上記の例のいくつかは llSubStringIndex を実行せずに return することがあります。

2. 工夫してメモリを抑えた例 (本来 60 バイト以下のところを 54 バイト以下にしました):

<lsl> // haystack に needle が含まれていたら 1 を、含まれていないならば 0 を返す。 integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

   return ~llSubStringIndex(haystack, needle);

} </lsl>

註: 関数 llSubStringIndex はキーワードが見つからなかった時だけ -1 を返し、ビット反転の演算子 ~ は -1 に適用されたた時だけ 0 を返します。従って ~llSubStringIndex という上手い組み合わせにより、見つからなかった時だけ 0、見つかった時は 0 以外を返すようにできます。

註: メモリを抑えた例は、Code RacerEfficiency Tester で計測した結果、殆ど実行速度に影響が見られませんでした。{ contains("wiki.secondlife.com", "wiki"); }

関連項目

関数

•  llListFindList リストの中の、特定のリストを検索する
•  llGetSubString 文字列から、特定の位置の文字列を取り出す。

特記事項

Search JIRA for related Issues

Signature

function integer llSubStringIndex( string source, string pattern );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。