Difference between revisions of "LlSubStringIndex/ja"
Jump to navigation
Jump to search
Mako Nozaki (talk | contribs) m (カテゴリ変更) |
|||
(3 intermediate revisions by 2 users not shown) | |||
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''' | |func_footnote='''pattern''' が '''source''' で見つからなかった場合、 {{HoverText|-1|マイナス 1, 0x{{LSL_Hex/Write|-1}}}} が返されます。<br/> | ||
文字列の先頭文字のインデックスは {{HoverText|0|ゼロ}} です。 | |||
|func_desc | |func_desc | ||
|return_text='''source''' | |return_text='''source''' の中にある最初の '''pattern''' のインデックス | ||
|spec | |spec | ||
|caveats=* | |caveats=*リテラルマッチ (大文字小文字区別する) です。 | ||
**ワイルドカードや正規表現は使えません。 | **ワイルドカードや正規表現は使えません。 | ||
* | *空文字列 ("") と比較しようとした場合、 -1 でなく 0 が返ります。 | ||
* | *指定したオフセットから文字列の検索を行う関数はありません。 [[#See Also|関連項目]] に末尾から検索する関数があります。 | ||
|constants | |constants | ||
|examples= | |examples=ラスト・ネームを比較する: | ||
< | <source lang="lsl2"> | ||
default | default | ||
{ | { | ||
Line 28: | Line 27: | ||
//検知されたアバター名を順に " Linden" とマッチングさせる。 | //検知されたアバター名を順に " Linden" とマッチングさせる。 | ||
//これは Linden | //これは Linden というラスト・ネームとのマッチングになる。(ファースト・ネームの先頭にスペースは入らないから。) | ||
// | //逆にファースト・ネームとマッチングするならば "FirstName " とマッチングさせる。 | ||
for(i = 0; i < NumDet; ++i) | for(i = 0; i < NumDet; ++i) | ||
Line 36: | Line 35: | ||
} | } | ||
} | } | ||
</ | </source> | ||
'''基本的な例:''' | '''基本的な例:''' | ||
< | <source lang="lsl2">integer index = llSubStringIndex("string data","TEST"); | ||
if(index == -1) { | if(index == -1) { | ||
llSay(0,"TEST という語は文字列中に見つかりませんでした。"); | llSay(0,"TEST という語は文字列中に見つかりませんでした。"); | ||
} else { | } else { | ||
llSay(0,"TEST という語が文字列中に見つかりました。"); | llSay(0,"TEST という語が文字列中に見つかりました。"); | ||
}</ | }</source> | ||
=== String Cheese === | |||
<source lang="lsl2">//この例では指定した文字列の中に単語があるかどうかを問い合わせる方法を示しています。 | |||
//この関数には制限があります。検索する文字列は (大文字小文字区別して) 完全に一致していなければなりません。 | |||
//このため、下の 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."); | |||
} | |||
} | |||
} | |||
}</source> | |||
|helpers= | |helpers= | ||
ある文字列が、特定のキーワードを含んでいるか調べる: | ある文字列が、特定のキーワードを含んでいるか調べる: | ||
Line 50: | Line 110: | ||
1. 簡潔かつ通常の手法: | 1. 簡潔かつ通常の手法: | ||
< | <source lang="lsl2"> | ||
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex | integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex | ||
{ | { | ||
return 0 <= llSubStringIndex(haystack, needle); | return 0 <= llSubStringIndex(haystack, needle); | ||
} | } | ||
</ | </source> | ||
< | <source lang="lsl2">integer startswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex | ||
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; | ||
} | }</source> | ||
</ | |||
< | <source lang="lsl2">integer endswith(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex | ||
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; | ||
} | }</source> | ||
</ | |||
注意: スニペットによっては、 llSubStringIndex を一度も呼ばずに復帰するものもあります。 | |||
2. | 2. 賢くよりメモリを節約する方法 (計算に使用するメモリが最大 60 バイトでなく、 54 バイトになります) : | ||
< | <source lang="lsl2">integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex | ||
integer contains(string haystack, string needle) // http://wiki.secondlife.com/wiki/llSubStringIndex | |||
{ | { | ||
return ~llSubStringIndex(haystack, needle); | return ~llSubStringIndex(haystack, needle); | ||
} | }</source> | ||
</ | |||
注意: llSubStringIndex 関数は、見つからなかったときだけ -1 を返し、 ~ 演算子は -1 のときだけ 0 を返すことから、頭のいい組み合わせである ~llSubStringIndex は見つからなかったときだけ 0 を返し、見つかったときには 0 以外を返すことになります。 | |||
Note: [[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 | ||
|also_articles | |also_articles | ||
|notes | |notes | ||
|cat1=String | |cat1=String | ||
|cat2 | |cat2 | ||
|cat3 | |cat3 | ||
|cat4 | |cat4 | ||
}} | }} |
Latest revision as of 14:39, 25 February 2016
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
要約
関数: integer llSubStringIndex( string source, string pattern );警告
- リテラルマッチ (大文字小文字区別する) です。
- ワイルドカードや正規表現は使えません。
- 空文字列 ("") と比較しようとした場合、 -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 Racer や Efficiency Tester のテストハーネスで { contains("wiki.secondlife.com", "wiki"); } の表記で計測した結果、小さいからといって速くなったり遅くなったりすることはありませんでした。
関連項目
関数
• | llListFindList | – | リストの中で他のリストを検索する | |
• | llGetSubString | – | 文字列の一部をコピーして取り出す。 | |
• | String: Find Last Index | – | 文字列の中の 最後に パターンが現れるインデックスを integer で返す。 |
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。