LlSubStringIndex/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

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

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

• string source
• string pattern

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

警告

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

サンプル

ラスト・ネームを比較する:

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!");
    }
}

基本的な例:

integer index = llSubStringIndex("string data","TEST");
if(index == -1) {
    llSay(0,"TEST という語は文字列中に見つかりませんでした。");
} else {
    llSay(0,"TEST という語が文字列中に見つかりました。");
}

String Cheese

//この例では指定した文字列の中に単語があるかどうかを問い合わせる方法を示しています。
//この関数には制限があります。検索する文字列は (大文字小文字区別して) 完全に一致していなければなりません。
//このため、下の 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.");
            }
        }
    }
}

便利なスニペット

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

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

integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
    return 0 <= llSubStringIndex(haystack, needle);
}
integer startswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
    return llDeleteSubString(haystack, llStringLength(needle), -1) == needle;
}
integer endswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
    return llDeleteSubString(haystack, 0, ~llStringLength(needle)) == needle;
}

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

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

integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
    return ~llSubStringIndex(haystack, needle);
}

注意: 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の関連した項目が参考になるかもしれません。