string
説明
文字列を表すクラスです。
文字列を検査、検索/置換、および操作するためのメソッドが含まれています。
エンコーディングと文字列インデックス
FlexSim内の文字列はUTF-8形式にエンコードされます。つまり、単純なASCII文字列の場合、各文字は1バイト(8ビット)を占有します。ただし、非ASCII文字列は最大4バイトで構成される場合があります。たとえば、ギリシャ文字のΣをUTF-8でエンコードするには2バイトが必要です。
文字列内の任意の文字が複数バイトで構成される可能性があるため、文字インデックスで文字列内の文字にアクセスするのは容易ではありません。そのため、FlexSimの文字列インターフェイスでは、文字列内の文字にアクセスする際、バイトベースのインデックス付けを使用します。つまり、インデックスを取得するまたはインデックスを文字列に返す文字列メソッド(charAt()、substr()、slice()、indexOf()、lastIndexOf()、search()、slice()、length、array[]演算子)はすべて文字インデックスではなくバイトインデックスを取得して返します。また、FlexSimでは、すべてのインデックス付けが1ベースです。つまり、文字列内の先頭バイトにアクセスするには、インデックス1を使用します(他の多くのプログラミング言語のようにインデックス0ではない)。
たとえば、文字列"Σ=σ"について考えてみましょう。=文字は、厳密に言えば2番目の文字であるため、「文字インデックス」は2ですが、Σ文字が2バイトを占有するため、「バイトインデックス」でアクセスする場合は3になります。
string("Σ=σ").charAt(3) // returns "="
なお、このルールを前提とすれば、1文字が複数バイトを占有する場合、別々のバイトインデックスを使用する複数のコマンド呼び出しが同じ結果を返す可能性もあります。
string("Σ=σ").charAt(1) // returns "Σ"
string("Σ=σ").charAt(2) // returns same "Σ"
一般にこの件は、文字列の操作方法には影響しません。replace()メソッドやmatch()メソッドのように、多くのメソッドでは、インデックスによる文字列アクセスを必要としないためです。文字列内の文字に手動でアクセスする必要がある場合は、コード内であらゆる種類の文字に対応できるメソッドがいくつかあります。
エンコーディングを気にせずに個別の文字を操作する最も簡単な方法は、split()メソッドとjoin()メソッドを使用することです。split()メソッドは、文字列を個別の文字の配列に分割します。分割後の配列は、バイトインデックスではなく文字インデックスで走査できます。処理が終了した後、配列を結合して文字列に戻すことができます。
string str = "Σ=σ";
Array asArray = str.split();
for (int i = 1; i <= asArray.length; i++) {
if (asArray[i] == "=")
asArray[i] = "≠";
}
str = asArray.join(); // "Σ≠σ"
バイトではなく文字を使用して文字列を検索したいものの、文字列を配列に分割したくない場合、文字列全体をループするという方法があります。その際には、charAt()メソッドを使用して、各文字のバイト長に基づいてループインデックスをインクリメントします。
string str = "Σ=σ";
string curChar = "";
for (int i = 1; i <= str.length; i += curChar.length) {
curChar = str.charAt(i);
if (curChar == "=") {
str = str.substring(1, i) + "≠" + str.substring(i + curChar.length);
curChar = "≠";
}
}
文字列からASCII文字の値のみを検索/置換する場合、[ ]配列演算子を使用した文字列検索を使用できます。
string str = "Σ=σ";
for (int i = 1; i <= str.length; i++) {
if (str[i] == '=') // comparing a byte to an ASCII character works fine
str[i] = '#'; // setting a byte to an ASCII character works fine,
// as long as the existing byte was already an ASCII character.
}
最後に、stringには、文字インデックスとバイトインデックスの変換を行うbyteToCharIndex()メソッドとcharToByteIndex()メソッドが用意されています。なお、これらのメソッドは文字列の検索を必要とするため、長い文字列の場合は時間がかかります。
プロパティ
length | 文字列の長さ(バイト単位)。 |
メソッド
byteToCharIndex | 文字列内の特定のバイトインデックスに関連付けられた文字インデックスを返します。 |
charAt | 文字列内の指定されたバイトインデックスにある文字を返します。 |
charToByteIndex | 文字列内の特定の文字インデックスに関連付けられたバイトインデックスを返します。 |
endsWith | 文字列が指定の部分文字列で終わっているかどうかをチェックします。 |
includes | 文字列に指定の部分文字列が含まれているかどうかをチェックします。 |
indexOf | 指定された部分文字列の最初の出現先のインデックスを返します。 |
lastIndexOf | 指定された部分文字列の最後の出現先のインデックスを返します。 |
match | 文字列からパターンとの一致を検索します。 |
padEnd | 文字列が指定の長さになるまで、末尾をpadStringでパディングします。 |
padStart | 文字列が指定の長さになるまで、先頭をpadStringでパディングします。 |
repeat | オリジナルのコピーから新しい文字列を作成します。 |
replace | 文字列を別の文字列に置き換えます。 |
search | 文字列から内部文字列またはパターンを検索します。 |
slice | 文字列の断片を抽出して、新しい文字列を返します。 |
split | 文字列を部分文字列の配列に分割します。 |
startsWith | 文字列が指定の部分文字列で始まっているかどうかをチェックします。 |
substr | 文字列の断片を抽出して、新しい文字列を返します。 |
toLowerCase | すべての文字を小文字に変換します。 |
toNum | 文字列の内容を浮動小数点数として解釈します。 |
toUpperCase | すべての文字を大文字に変換します。 |
trim | 先行する空白と後続の空白を除去します。 |
静的メソッド
fromNum | 指定された数値を文字列に変換します。 |
演算子
!= | 2つの文字列を比較します。 |
[ ] | 文字列内のバイト要素を取得または設定します。 |
+ | 2つの文字列を連結します。 |
+= | 他の文字列と連結する文字列を代入します。 |
== | 2つの文字列を比較します。 |
詳細
string.byteToCharIndex()
int byteToCharIndex( int byteIndex ) |
パラメータ
byteIndex | ターゲット文字の1ベースのバイトインデックス。 |
戻り値
int | 文字の1ベースの文字インデックス。 |
説明
文字列内の特定のバイトインデックスに関連付けられた文字インデックスを返します。
string text = "Σ=σ";
int charIndex = text.byteToCharIndex(text.search("=")); // 2
int numChars = text.byteToCharIndex(text.length); // 3 - the number of characters in the string
string.match()
RegExResult match( RegExp pattern ) |
パラメータ
pattern | 検索する文字列のパターン。正規表現。 |
戻り値
RegExResult | 一致へのアクセスを提供するRegExResultオブジェクト。 |
説明
文字列からパターンとの一致を検索します。
string str = "A noisy noise annoys an oyster.";
var result = str.match(/nois/g);
Array matches = [result[1], result[2]]; // ["nois", "nois"]
正規表現の詳細については、replace()メソッドを参照してください。
string.padEnd()
string padEnd( int targetLength , string padString = " " ) |
パラメータ
targetLength | パディング先の文字列に必要な長さ。 |
padString | 現在の文字列をパディングする際に使用する文字列。 |
戻り値
string | 指定された長さまでパディングされた文字列。 |
説明
文字列が指定の長さになるまで、末尾をpadStringでパディングします。
文字列が指定のtargetLengthになるまで、末尾をpadStringでパディングします。targetLengthが文字列の長さ未満の場合は、パディングせずに文字列を返します。
string s = "abc";
s.padEnd(10); // "abc "
s.padEnd(10, "foo"); // "abcfoofoof"
s.padEnd(6,"123465"); // "abc123"
s.padEnd(8, "0"); // "abc00000"
s.padEnd(1); // "abc"
string.padStart()
string padStart( int targetLength , string padString = " " ) |
パラメータ
targetLength | パディング先の文字列に必要な長さ。 |
padString | 現在の文字列をパディングする際に使用する文字列。 |
戻り値
string | 指定された長さまでパディングされた文字列。 |
説明
文字列が指定の長さになるまで、先頭をpadStringでパディングします。
文字列が指定のtargetLengthになるまで、先頭をpadStringでパディングします。targetLengthが文字列の長さ未満の場合は、パディングせずに文字列を返します。
string s = "abc";
s.padStart(10); // " abc"
s.padStart(10, "foo"); // "foofoofabc"
s.padStart(6,"123465"); // "123abc"
s.padStart(8, "0"); // "00000abc"
s.padStart(1); // "abc"
string.replace()
string replace( string findStr , string replaceWith , int replaceAll = 0 ) |
string replace( RegExp findPattern , string replaceWith ) |
パラメータ
findStr | 検索する文字列。 |
replaceWith | findStrを置き換える文字列。 |
replaceAll | findStrのすべてのインスタンスを置き換える場合、1に設定します。 |
findPattern | 検索する文字列のパターン。正規表現。 |
戻り値
string | 文字列のコピー。検索パターンが新しい文字列に置き換えられています。 |
説明
文字列を別の文字列に置き換えます。
正規表現
正規表現は、検索する文字列のパターンを指定する簡潔な方法です。正規表現を前方スラッシュ「/」で囲んで(文字列を引用符で囲むのと同様)から、修飾子を追加します。
/pattern/modifiers
/[0-9]+/g
正規表現構文の簡単な説明を以下に示します。
修飾子
正規表現の終了を示す/の後に配置し、その動作を修飾します。
g - グローバルな一致。最初の出現だけでなく、すべての出現に一致します。
i - 大文字と小文字を区別しない一致。
括弧
[] - 括弧内の任意の文字に一致します。ダッシュを使用して文字の範囲を指定できます。
[abc]
- a、b、またはcに一致します。[a-z]
- 任意の小文字に一致します。[0-9]
- 任意の数字に一致します。[^abc]
- a、b、c以外の任意の文字に一致します。
OR
| - |で区切られた任意の選択肢に一致します。
(abc|cba)
- 「abc」または「cba」というシーケンスに一致します。(gray|grey)
またはgr(a|e)y
- 「gray」と「grey」に一致します。
数量詞
直前の式に一致する文字の反復回数を定義します。
* - 指定された文字の0回以上の繰り返しに一致します。
ab*c
- 「ac」、「abc」、「abbc」、「abbbc」などに一致します。基本的に、a、次に任意の数のb、その次にcが続く任意の文字列に一致します。
+ - 指定された文字の1回以上の繰り返しに一致します。
ab+c
- ab*cとほぼ同じですが、「ac」には一致しません。
? - 指定された文字が0または1つある任意の文字列に一致します。
colou?r
- 「color」と「colour」の両方に一致しますが、「colouur」には一致しません。
繰り返し
{n} - n個の出現と一致します。
{m,n} - m個以上n個以下の出現と一致します。
ピリオド
.- 任意の文字と一致します。
\.- ピリオドと一致します。
キャプチャーグループ
括弧を使用してキャプチャーグループを定義することもできます。文字パターンを括弧で囲むことにより、括弧内に一致する結果が保存され、文字列の置き換えに使用されます。置換文字列内で$1や$2などの項目を使用して、検索パターンで取得された1つ目、2つ目、3つ目などのグループを参照します。
例:
次のコードはすべての数値を削除します。まず、0~9の数字とその繰り返しを長さに関係なく検索するために、[0-9]と指定し、その後ろに+を追加します。最後に、すべての出現と一致するようにg修飾子を追加します。
string text = "300 out of 500 soda cans";
return text.replace(/[0-9]+/g, ""); // " out of soda cans"
次のコードは、「blue」または「green」を、大文字と小文字を問わず「red」に置き換えます。
string text = "Blue cars are really green.";
return text.replace(/blue|green/gi, "red"); // "red cars are really red."
次のコードは、bで始まりtで終わる3文字の単語をすべて置き換えます。
string text = "My favorite words are: bit bat but bot bet.";
return text.replace(/b[aeiou]t/g, "Money"); // My favorite words are: Money Money Money Money Money.
次のコードは、電子メールアドレスを非表示にします。「\.」は、任意の文字ではなく、ピリオドであることを示したい場合に使用します。
string text = "Email me at [email protected] or [email protected]";
return text.replace(/([a-z0-9_\.-]+)@([0-9a-z\.-]+)\.([a-z\.]{2,6})/g, "###"); //Email me at ### or ###
FlexScriptの文字列の正規表現の実装では、その機能にc++の正規表現ライブラリとECMAScript文法が使用されています。当社の設計は、JavaScriptの正規表現の実装からも影響を受けています。string.replace()メソッドの正規表現オーバーロードは、std::regex_replace呼び出しのラッパーです。正規表現の作成の詳細については、該当するドキュメントを参照してください。なお、JavaScriptの正規表現フラグ/m、/y、/uは、(まだ)実装されていません。
string.search()
int search( string str ) |
パラメータ
str | 検索対象の文字列またはパターン。 |
戻り値
int | 検出された場合は、検出文字列の1ベースのバイトインデックス。それ以外の場合は-1。 |
説明
文字列から内部文字列またはパターンを検索します。
string str = "Hello, how are you?";
int howIndex = str.search("how"); // 8
文字列の検索には、正規表現も使用できます。
string str = "Hello, how are you?";
int howIndex = str.search(/h[a-z]+/); // 8 (first word starting with h)
正規表現の詳細については、replace()メソッドを参照してください。
string.slice()
string slice( int beginIndex , int endIndex = 0 ) |
パラメータ
beginIndex | 抽出する最初の文字の1ベースのバイトインデックス。このインデックスがマルチバイト文字の中間にある場合、文字全体を抽出します。負の数字なら、文字列の末尾からインデックス付けされたオフセットです。 |
endIndex | 最後の文字の1ベースのバイトインデックス。抽出は、このインデックスにある文字の手前まで行われます。インデックスがマルチバイト文字の中間にある場合、抽出対象にはこの文字全体が含まれます。このパラメータが省略された場合は、文字列の最後まで抽出されます。パラメータが負なら、文字列の末尾からインデックス付けされたオフセットです。 |
戻り値
string | 抽出された文字列。 |
説明
文字列の断片を抽出して、新しい文字列を返します。
string text = "Hello World!";
string subText = text.slice(1, 6); // "Hello"
負の数字を使用すると、文字列の末尾から開始します。
string text = "Hello World!";
string subText = text.slice(-6); // "World!"
string.split()
Array split( string delimiter = "" , int limit = -1 ) |
Array split( RegExp delimiter , int limit = -1 ) |
パラメータ
delimiter | 文字列を分割するセパレータを示す文字列。このパラメータが省略された場合や空の文字列の場合は、各文字が個別の配列要素に分割されます。 |
limit | 返す配列要素の最大数。省略された場合は、文字列全体が分割されます。 |
戻り値
Array | 指定されたセパレータが見つかった場合に、文字列を分割することによって作成された部分文字列の配列。 |
説明
文字列を部分文字列の配列に分割します。
string str = "Hello, how are you?";
Array subStrings = str.split(" ", 3); // ["Hello,", "how", "are"]
string csv = "foo,bar,,baz";
Array subStrings = csv.split(","); // ["foo", "bar", "", "baz"]
区切る文字列の検索には、正規表現も使用できます。このコードは数値を削除します。
string str = "abcd123efg456hij789klm0";
Array subStrings = str.split(/[0-9]+/g); // ["abcd", "efg", "hij", "klm", ""]
正規表現の詳細については、replace()メソッドを参照してください。
string.substr()
string substr( int beginIndex , int length ) |
パラメータ
beginIndex | 抽出する最初の文字の1ベースのバイトインデックス。このインデックスがマルチバイト文字の中間にある場合、文字全体を抽出します。負の数字なら、文字列の末尾からのオフセットになります。 |
length | ターゲット文字列の長さ(バイト単位)。 |
戻り値
string | 抽出された文字列。 |
説明
文字列の断片を抽出して、新しい文字列を返します。
string text = "Hello World!";
string subText = text.substr(1, 5); // "Hello"
最初のパラメータが負なら、末尾からその数だけの文字をカウントします。
string text = "Hello World!";
string subText = text.substr(-6, 5); // "World" without the "!"
string.operator [ ]
int operator [ ]( int byteIndex ) |
パラメータ
byteIndex | ターゲットバイトの1ベースのバイトインデックス。 |
戻り値
int | 配列の要素。 |
説明
文字列内のバイト要素を取得または設定します。
[ ]演算子は、文字列の個々の要素にバイト値としてアクセスします。ASCII文字列の場合は、'A'、'B'、'C'などの単一引用符リテラルを使用したASCII文字値と比較できます。すべてのASCII文字値が整数範囲の1~127に含まれます。マルチバイト文字の場合は、個々のバイトにアクセスすると、整数範囲の128~255の値が返されます。[ ]演算子を使用してアクセスされる文字列内の非ASCIIマルチバイト文字は読み取り専用です。[ ]演算子を使用してマルチバイト文字列の一部のバイトの値を設定しようとすると、FlexSimが例外をスローします。
string str = "Σ=σ";
for (int i = 1; i <= str.length; i++) {
if (str[i] == '=') // comparing a byte to an ASCII character works fine
str[i] = '#'; // setting a byte to an ASCII character works fine,
// as long as the existing byte was already an ASCII character.
if (str[i] >= 128)
str[i] = ' '; // setting a byte that is part of a multi-byte character will throw an exception
}