Difference between revisions of "LlSubStringIndex/ja"

From Second Life Wiki
Jump to navigation Jump to search
m (Undo revision 852002 by Mako Nozaki (Talk))
Line 3: Line 3:
|func=llSubStringIndex
|func=llSubStringIndex
|return_type=integer|p1_type=string|p1_name=source|p2_type=string|p2_name=pattern
|return_type=integer|p1_type=string|p1_name=source|p2_type=string|p2_name=pattern
|func_footnote='''pattern''' が '''source''' に無かった場合、{{HoverText|-1|negative one, 0x{{LSL_Hex/Write|-1}}}} が返されます。<br/>
|func_footnote='''pattern''' が '''source''' で見つからなかった場合、 {{HoverText|-1|マイナス 1, 0x{{LSL_Hex/Write|-1}}}} が返されます。<br/>
先頭文字は {{HoverText|0|zero}} 文字目です。<br/>
文字列の先頭文字のインデックスは {{HoverText|0|ゼロ}} です。
全角文字も 1 文字として数えます。
|func_desc
|func_desc
|return_text='''source''' において '''pattern''' が最初に見つかる位置が先頭から何文字目か
|return_text='''source''' の中にある最初の '''pattern''' のインデックス
|spec
|spec
|caveats=*マッチングでは大文字/小文字、全角/半角を区別します。
|caveats=*リテラルマッチ (大文字小文字区別する) です。
**ワイルドカードや正規表現は使えません。
**ワイルドカードや正規表現は使えません。
*'''pattern''' を空文字列 ("") にした場合、-1 でなく 0 が戻ります。
*空文字列 ("") と比較しようとした場合、 -1 でなく 0 が返ります。
*'''source''' の末尾から先頭方向へ検索したり、特定の位置から検索を開始する関数はありません。
*指定したオフセットから文字列の検索を行う関数はありません。 [[#See Also|関連項目]] に末尾から検索する関数があります。
|constants
|constants
|examples=姓に関するマッチング:
|examples=ラスト・ネームを比較する:
<lsl>
<lsl>
default
default
Line 28: Line 27:
          
          
         //検知されたアバター名を順に " Linden" とマッチングさせる。
         //検知されたアバター名を順に " Linden" とマッチングさせる。
         //これは Linden という姓とのマッチングになる。(なぜなら名の先頭にスペースは入らないから。)
         //これは Linden というラスト・ネームとのマッチングになる。(ファースト・ネームの先頭にスペースは入らないから。)
         //逆に名とマッチングするならば "FirstName " とマッチングさせる。
         //逆にファースト・ネームとマッチングするならば "FirstName " とマッチングさせる。


         for(i = 0; i < NumDet; ++i)
         for(i = 0; i < NumDet; ++i)
Line 44: Line 43:
} else {
} else {
     llSay(0,"TEST という語が文字列中に見つかりました。");
     llSay(0,"TEST という語が文字列中に見つかりました。");
}</lsl>
=== String Cheese ===
<lsl>//この例では指定した文字列の中に単語があるかどうかを問い合わせる方法を示しています。
//この関数には制限があります。検索する文字列は (大文字小文字区別して) 完全に一致していなければなりません。
//このため、下の string_example にマッチすることはそうそうないでしょう。
string string_example = "ThIs serVes As aN exaMplE sTrinG. It ISn't toO coMPleX bUt HaS sOme mIlD vARietY";
//スクリプトの入っているオブジェクトが聞こえる範囲内で "Search for search_word" とチャットで問いかけると、
//(チャットメッセージを検索して) "search for" の部分を認識し、それに続く文字列を取得します。
//そしてこれらの単語で string_example をチェックします。
string search_test_a = "seArCh foR";
//下の例は同じように動作しますが、認識した質問の前に単語を検索します。
string search_test_b = "is the word I seek";
//この変数を使うと、スクリプト実行時に msg を破壊することなく単語を扱うことができるようになります。
                 
string search_word;
default
{
    on_rez(integer param)//on_rez でリセットするといろいろいいことがありますが、
    { //場合によっては格納された変数、リスト、キューに入っているイベントが破棄されるので、良くないこともあります。
        llResetScript();
    }
    state_entry()
    {  //お遊びです (しかしオブジェクトが何を話しているか知ることができます)
        llSetObjectName("String Cheese");
        llListen(0, "", llGetOwner(), "");//パブリックチャネルでのあなたの発言を全て聞き取ります
    }
    listen(integer chan, string name, key id, string msg)
    {
        if(llSubStringIndex(llToUpper(msg), llToUpper(search_test_a)) != -1)
        {
            search_word = llStringTrim(llGetSubString(msg, llStringLength(search_test_a), -1), STRING_TRIM);
            if(llSubStringIndex(llToUpper(string_example), llToUpper(search_word)) != -1)
            {
                llSay(0, "I have found the word " + "''" + search_word + "''" + " in the example string");
            }
            else                       
            {
                llSay(0, "I cannot find the word " + "''" + search_word + "''" + " in the example string.");
            }
        }
        if(llSubStringIndex(msg, search_test_b) != -1)
        {
            search_word = llStringTrim(llGetSubString(msg, 0, (llSubStringIndex(msg, search_test_b)-1)), STRING_TRIM);
            if(llSubStringIndex(string_example, search_word) != -1)
            {
                llSay(0, "I have found the word " + "''" + search_word + "''" + " in the example string");
            }
            else
            {
                llSay(0, "I cannot find the word " + "''" + search_word + "''" + " in the example string.");
            }
        }
    }
}</lsl>
}</lsl>
|helpers=
|helpers=
Line 51: Line 111:


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


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


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


: 上記の例のいくつかは llSubStringIndex を実行せずに return することがあります。
注意: スペニットによっては、 llSubStringIndex を一度も呼ばずに復帰するものもあります。


2. 工夫してメモリを抑えた例 (本来 60 バイト以下のところを 54 バイト以下にしました):
2. 賢くよりメモリを節約する方法 (計算に使用するメモリが最大 60 バイトでなく、 54 バイトになります) :


<lsl>
<lsl>integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
// haystack に needle が含まれていたら 1 を、含まれていないならば 0 を返す。
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
{
     return ~llSubStringIndex(haystack, needle);
     return ~llSubStringIndex(haystack, needle);
}
}</lsl>
</lsl>
 
注意: llSubStringIndex 関数は、見つからなかったときだけ -1 を返し、 ~ 演算子は -1 のときだけ 0 を返すことから、頭のいい組み合わせである ~llSubStringIndex は見つからなかったときだけ 0 を返し、見つかったときには 0 以外を返すことになります。


: 関数 llSubStringIndex はキーワードが見つからなかった時だけ -1 を返し、ビット反転の演算子 ~ は -1 に適用されたた時だけ 0 を返します。従って ~llSubStringIndex という上手い組み合わせにより、見つからなかった時だけ 0、見つかった時は 0 以外を返すようにできます。
Note: [[Code Racer]] や [[Efficiency Tester]] のテストハーネスで <nowiki>{ contains("wiki.secondlife.com", "wiki"); }</nowiki> の表記で計測した結果、小さいからといって速くなったり遅くなったりすることはありませんでした。


註: メモリを抑えた例は、[[Code Racer]] と [[Efficiency Tester]] で計測した結果、殆ど実行速度に影響が見られませんでした。<nowiki>{ contains("wiki.secondlife.com", "wiki"); }</nowiki>
|also_functions=
|also_functions=
{{LSL DefineRow||{{LSLG/ja|llListFindList}}|リストの中の、特定のリストを検索する}}
{{LSL DefineRow||{{LSLG/ja|llListFindList}}|リストの中で他のリストを検索する}}
{{LSL DefineRow||{{LSLG/ja|llGetSubString}}|文字列から、特定の位置の文字列を取り出す。}}
{{LSL DefineRow||{{LSLG/ja|llGetSubString}}|文字列の一部をコピーして取り出す。}}
{{LSL DefineRow||[[User:Void_Singer/Functions#String:_Find_Last_Index|String: Find Last Index]]|文字列の中の '''最後に''' パターンが現れるインデックスを integer で返す。}}
|also_tests
|also_tests
|also_events
|also_events

Revision as of 02:50, 15 May 2010

要約

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

source の中にある最初の pattern のインデックスを integer で返します。

• string source
• string pattern

patternsource で見つからなかった場合、 -1 が返されます。
文字列の先頭文字のインデックスは 0 です。

警告

  • リテラルマッチ (大文字小文字区別する) です。
    • ワイルドカードや正規表現は使えません。
  • 空文字列 ("") と比較しようとした場合、 -1 でなく 0 が返ります。
  • 指定したオフセットから文字列の検索を行う関数はありません。 関連項目 に末尾から検索する関数があります。
All Issues ~ Search JIRA for related Bugs

サンプル

ラスト・ネームを比較する: <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>

String Cheese

<lsl>//この例では指定した文字列の中に単語があるかどうかを問い合わせる方法を示しています。 //この関数には制限があります。検索する文字列は (大文字小文字区別して) 完全に一致していなければなりません。 //このため、下の string_example にマッチすることはそうそうないでしょう。

string string_example = "ThIs serVes As aN exaMplE sTrinG. It ISn't toO coMPleX bUt HaS sOme mIlD vARietY";

//スクリプトの入っているオブジェクトが聞こえる範囲内で "Search for search_word" とチャットで問いかけると、 //(チャットメッセージを検索して) "search for" の部分を認識し、それに続く文字列を取得します。 //そしてこれらの単語で string_example をチェックします。

string search_test_a = "seArCh foR";

//下の例は同じように動作しますが、認識した質問の前に単語を検索します。

string search_test_b = "is the word I seek";

//この変数を使うと、スクリプト実行時に msg を破壊することなく単語を扱うことができるようになります。

string search_word;

default {

   on_rez(integer param)//on_rez でリセットするといろいろいいことがありますが、
   { //場合によっては格納された変数、リスト、キューに入っているイベントが破棄されるので、良くないこともあります。
       llResetScript();
   }
   state_entry()
   {   //お遊びです (しかしオブジェクトが何を話しているか知ることができます)
       llSetObjectName("String Cheese");
       llListen(0, "", llGetOwner(), "");//パブリックチャネルでのあなたの発言を全て聞き取ります
   }
   listen(integer chan, string name, key id, string msg)
   {
       if(llSubStringIndex(llToUpper(msg), llToUpper(search_test_a)) != -1)
       {
           search_word = llStringTrim(llGetSubString(msg, llStringLength(search_test_a), -1), STRING_TRIM);
           if(llSubStringIndex(llToUpper(string_example), llToUpper(search_word)) != -1)
           {
               llSay(0, "I have found the word " + "" + search_word + "" + " in the example string");
           }
           else                         
           {
               llSay(0, "I cannot find the word " + "" + search_word + "" + " in the example string.");
           }
       }
       if(llSubStringIndex(msg, search_test_b) != -1)
       {
           search_word = llStringTrim(llGetSubString(msg, 0, (llSubStringIndex(msg, search_test_b)-1)), STRING_TRIM);
           if(llSubStringIndex(string_example, search_word) != -1)
           {
               llSay(0, "I have found the word " + "" + search_word + "" + " in the example string");
           }
           else
           {
               llSay(0, "I cannot find the word " + "" + search_word + "" + " in the example string.");
           }
       }
   }
}</lsl>

便利なスニペット

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

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

<lsl> integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

   return 0 <= llSubStringIndex(haystack, needle);

} </lsl>

<lsl>integer startswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

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

}</lsl>

<lsl>integer endswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

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

}</lsl>

注意: スペニットによっては、 llSubStringIndex を一度も呼ばずに復帰するものもあります。

2. 賢くよりメモリを節約する方法 (計算に使用するメモリが最大 60 バイトでなく、 54 バイトになります) :

<lsl>integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex {

   return ~llSubStringIndex(haystack, needle);

}</lsl>

注意: llSubStringIndex 関数は、見つからなかったときだけ -1 を返し、 ~ 演算子は -1 のときだけ 0 を返すことから、頭のいい組み合わせである ~llSubStringIndex は見つからなかったときだけ 0 を返し、見つかったときには 0 以外を返すことになります。

Note: Code RacerEfficiency Tester のテストハーネスで { contains("wiki.secondlife.com", "wiki"); } の表記で計測した結果、小さいからといって速くなったり遅くなったりすることはありませんでした。

関連項目

関数

•  llListFindList リストの中で他のリストを検索する
•  llGetSubString 文字列の一部をコピーして取り出す。
•  String: Find Last Index 文字列の中の 最後に パターンが現れるインデックスを integer で返す。

特記事項

Search JIRA for related Issues

Signature

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