(转载)虚幻引擎3--官网--虚幻脚本中的字符串处理
虚幻脚本中的字符串处理
概述
Object 和 Actor 类中包含很多用于执行使用虚幻脚本中的字符串或者与其相关的操作的操作符和函数。该文档详细描述了这些操作符和函数。
操作符
$(美元符号操作符)
string $ ( coerce string A, coerce string B )
$
操作符需要两个字符串, A 和 B ,然后连接它们。如果 A 或者 B 不是字符串,那么将会尝试将它们的值转换为字符串值。
示例:
`log("Unreal"$"Script"); //prints "UnrealScript"
$=
string $= ( out string A, coerce string B )
$=
操作符需要两个字符串, A 和 B ,连接它们,然后将最终的字符串分配给第一个字符串。如果 B 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
MyString = "Unreal"; MyString $= "Script"; // MyString 包含 "UnrealScript"
@(at 符号操作符)
string @ ( coerce string A, coerce string B )
@
操作符需要两个字符串, A 和 B ,然后连接它们,在它们两个之间放置一个空格。如果 A 或者 B 不是字符串,那么将会尝试将它们的值转换为字符串值。
示例:
log("Unreal"@"Engine"); //prints "Unreal Engine"
@=
string @= ( out string A, coerce string B )
@=
操作符需要两个字符串, A 和 B ,连接它们,在它们之间放置一个空格,然后将最终的字符串分配给第一个字符串。如果 B 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
MyString = "Unreal"; MyString @= "Engine"; // MyString contains "Unreal Engine"
<(小于号操作符)
bool < ( string A, string B )
< 操作符需要两个字符串, A 和 B ,然后如果第一个字符串按照字母顺序在第二个字符串前面,那么返回 true。 注意:大写字母将总是在小写字母的前面;如果不区分大小写时,请考虑使用 Caps。
示例:
("Monkey" < "Robot") //结果是 TRUE。
>(大于号操作符)
bool > ( string A, string B )
> 操作符需要两个字符串, A 和 B ,然后如果第一个字符串按照字母顺序在第二个字符串后面,那么返回 true。 注意:大写字母将总是在小写字母的前面;如果不区分大小写时,请考虑使用 Caps。
示例:
("Batman" > "Aquaman") //结果是 TRUE。
<=(小于或等于号操作符)
bool <= ( string A, string B )
<= 操作符需要两个字符串, A 和 B ,然后如果第一个字符串按照字母顺序在第二个字符串前面或者顺序一样,那么返回 true。 注意:大写字母将总是在小写字母的前面;如果不区分大小写时,请考虑使用 Caps。
示例:
("Monkey" <= "Robot") //结果是 TRUE。 ("Monkey" <= "Monkey") //结果是 TRUE。
>=(大于或等于号操作符)
bool >= ( string A, string B )
>= 操作符需要两个字符串, A 和 B ,然后如果第一个字符串按照字母顺序在第二个字符串后面或者顺序一样,那么返回 true。 注意:大写字母将总是在小写字母的前面;如果不区分大小写时,请考虑使用 Caps。
示例:
("Monkey" >= "Robot") //结果是 FALSE。 ("Monkey" >= "Monkey") //结果是 TRUE。
==(等号操作符)
bool == ( string A, string B )
== 操作符需要两个字符串, A 和 B ,如果这两个字符串相同,那么返回 true。 注意,这是一个区分大小写的比较。
示例:
("Monkey" == "Robot") //结果是 FALSE。 ("Monkey" == "Monkey") //结果是 TRUE。 ("Monkey" == "monkey") //结果是 FALSE。
!=(不等号操作符)
bool != ( string A, string B )
!= 操作符需要两个字符串, A 和 B ,如果这两个字符串不同,那么会返回 true。 注意,这是一个区分大小写的比较。
示例:
("Monkey" != "Robot") //结果是 TRUE。 ("Monkey" != "Monkey") //结果是 FALSE。 ("Monkey" != "monkey") //结果是 TRUE。
~=(约等号操作符)
bool ~= ( string A, string B )
== 操作符需要两个字符串, A 和 B ,如果这两个字符串相同(不考虑大小写),那么返回 true。
示例:
("Monkey" ~= "Robot") //结果是 FALSE。 ("Monkey" ~= "Monkey") //结果是 TRUE。 ("Monkey" ~= "monkey") //结果是 TRUE。
-=(减法赋值操作符)
string -= ( out string A, coerce string B );
-= 操作符会从 A 中删除 B ,然后将结果分配给 A 。这是一个区分大小写的操作。如果 B 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
MyString = "test: this is a test"; MyString -= "test"; log(MyString); // 输出: ": this is a ";
Object 函数
Len
int Len ( coerce string S )
返回字符串的长度。
示例:
Len("this"); //返回 4;
InStr
int InStr ( coerce string S, coerce string t )
InStr() 函数会返回在字符串 S 中第一次出现子字符串 t 的位置。 如果没有发现子字符串,那么 InStr 会返回 1。注意,搜索是区分大小写的,所以如果您不关心大小写,那么可以考虑在使用 InStr 之前调用 Caps。如果 S 或者 t 不是字符串,那么将会尝试将它们的值转换为字符串值。
示例:
InStr("These PANTS rock!", "PANTS"); //返回 6 InStr("These PANTS rock!", "pants"); //返回 -1 InStr( Caps("These PANTS rock!"), Caps("pants") ); //返回 6
Mid
string Mid ( coerce string S, int i, optional int j )
Mid() 函数从字符串 S
的字符 i
开始复制 j 个字符来生成一个 S
的子字符串。 如果省略了 j ,那么将会复制所有的剩余字符串。 i 的值在 0 到字符串长度的区间限定之间。 j 的值在 i 到字符串长度的区间限定内。如果 S 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
Mid("These PANTS rock!", 6, 5); //返回 "PANTS" Mid("These PANTS rock!", 6); //返回 "PANTS rock!"
Left
string Left ( coerce string S, int i )
Left() 函数会返回给定字符串 S 中 i 最左边的字符。 它会将这个字符串返回到索引 i 的左边,但是不包括该字符。如果 S 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
Left("These PANTS rock!", 5); //返回 "These"
Right
string Right ( coerce string S, int i )
Right() 函数会返回给定字符串 S 中 i 最右边的字符。如果 S 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
Right("These PANTS rock!", 5); //返回 "rock!"
Caps
string Caps ( coerce string S )
Caps() 函数会返回给定字符串 S 的大写字母版本。如果 S 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
Caps("wooo"); //返回 "WOOO"
Locs
string Locs ( coerce string S )
Locs() 函数会返回给定字符串 S 的小写字母版本。如果 S 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
Locs("WoOo"); //返回 "wooo"
Chr
string Chr ( int i )
Chr() 函数会返回给定 int 的字符串表示形式。 它可以是 Unicode 范围 0 - 65535 内的任何值。
示例:
Chr(65); //返回 "A"
Asc
int Asc ( string S )
Asc() 函数会返回给定字符串 S 的第一个字母的数字形式的 Unicode 表示形式。
示例:
Asc("A"); //返回 65
Repl
string Repl ( coerce string Src, coerce string Match, coerce string With, optional bool bCaseSensitive )
Repl() 函数会使用 Src 中的 With 替换所有出现 Match 的地方。如果 Src 、 Match 或者 With 不是字符串,那么将会尝试将它们的值转换为字符串值。
示例;
Repl("This is a test", "is", "was"); // 会产生 "Thwas was a test"; Repl("Two be or not two be", "two", "to", true); // 返回 "Two be or not to be" Repl("Two be or not two be", "two", "to", false); // 返回 "to be or not to be"
Split(分隔)
static final function string Split(coerce string Text, coerce string SplitStr, optional bool bOmitSplitStr)
Split() 函数会在第一次出现 SplitStr 的地方分割 Text ,然后返回 Text 的剩余部分。如果 bOmitSplitStr 为 TRUE,那么会从返回的 Text 的剩余部分中省略 SplitStr 。否则,包括它在内。 如果 Text 或者 SplitStr 不是字符串,那么会尝试将它们的值转换为字符串值。
示例:
Split("Unreal Engine uses UnrealScript as its scripting language", "scripting", false); // 返回 "scripting language" Split("Unreal Engine uses UnrealScript as its scripting language", "scripting", true); // 返回 " language"
GetRightMost
string GetRightMost( coerce string Text )
GetRightMost() 函数使得 Text 在最右边的 '_' 字符后面,例如,actor 名称中的数字。如果 Text 不是字符串,那么会尝试将它的值转换为一个字符串值。
示例:
GetRightMost("CoverLink_45"); // 返回 "45"
JoinArray
JoinArray(array<string> StringArray, out string out_Result, optional string delim = ",", optional bool bIgnoreBlanks = true)
JoinArray() 函数会使用指定的 delim 分界符从字符串的 StringArray 数组中创建一个单独的字符串,然后将结果字符串分配给 out_Result 。如果 bIgnoreBlanks 为 TRUE,那么将会忽略空白的 StringArray 中的元素。
示例:
Maps[0] = "Deck"; Maps[1] = "Necropolis"; Maps[2] = "Sandstorm"; Maps[2] = "Sanctuary"; JoinArray(Maps, MapString); // MapString contains "Deck,Necropolis,Sandstorm,Sanctuary"
ParseStringIntoArray
ParseStringIntoArray(string BaseString, out array<string> Pieces, string Delim, bool bCullEmpty)
ParseStringIntoArray() 函数会使用指定的 Delim 分界符将一个字符串划分为字符串数组的元素,然后将结果数组分配给 Pieces 。如果 bCullEmpty 为 TRUE,当分界符出现在中间过程时,通常不会将使用这个实例创建的空白元素添加到数组中。
示例:
ParseStringIntoArray("Deck,Necropolis,,Sandstorm,Sanctuary", Maps, ",", false); // 地图包含 {Deck, Necropolis, , Sanstorm, Sanctuary} ParseStringIntoArray("Deck,Necropolis,,Sandstorm,Sanctuary", Maps, ",", true); // 地图包含 {Deck, Necropolis, Sanstorm, Sanctuary}
SplitString
array<string> SplitString( string Source, optional string Delimiter=",", optional bool bCullEmpty )
SplitString() 函数是一个使用 ParseStringIntoArray() 函数将字符串分割为字符串的数组的封装类。唯一的真正区别是这个数组是 SplitString() 函数的返回值,而不是 out 参数。
示例:
SplitString("Deck,Necropolis,,Sandstorm,Sanctuary", ",", false); // 返回 {Deck, Necropolis, , Sanstorm, Sanctuary} 的数组 ParseStringIntoArray("Deck,Necropolis,,Sandstorm, Maps, ",", false);// 地图包含 {Deck, Necropolis, , Sanstorm, Sanctuary}
Actor 函数
ReplaceText
function ReplaceText(out string Text, string Replace, string With)
ReplaceText() 函数与 Repl() 函数相似,只是会将结果分配给输入字符串 Str 。
示例:
Str = "This is a test"; ReplaceText(Str, "is", "was"); // Str 包含了 "Thwas was a test"; Str = "Two be or not two be"; ReplaceText(Str, "two", "to"); // Str 包含了 "Two be or not to be"
GetItemName
String GetItemName( string FullName )
GetItemName() 函数会接受一个 "Package.Item" 字符串并返回它的 "Item" 部分。
示例:
GetItemName(string(self)); // 返回这个类名称 GetItemName("Package.Group.bla.Item"); // 返回 "Item"
特殊注意事项
字符串连接和赋值
您经常看到类似于以下的脚本代码:
for ( i = 0; i < Count; i++ ) { if ( MyString != "" ) { MyString = MyString + ", "; } MyString = MyString + NextArrayValue[i]; }
目前有两个字符串操作符来执行字符串连接和分配:
native(322) static final operator(44) string $= ( out string A, coerce string B ); native(323) static final operator(44) string @= ( out string A, coerce string B);
可以重写上面的代码,如下所示:
for ( i = 0; i < Count; i++ ) { if ( MyString != "" ) { MyString $= ", "; } MyString $= NextArrayValue[i]; }
原因是 $= 操作符更快!
这里是针对每个版本的真正的处理过程:
MyString = MyString + NextArrayValue[i];
- 计算左侧;查找
MyString
变量的地址。 - 计算右侧;激活 + 操作符 (
execString_Concat
) - 查找
MyString
变量的地址;通过 + 操作符把它的值复制到临时缓存中以便使用。 - 查找
NextArrayValue
(execArrayElement
) 的地址;通过 + 操作符把它的值复制到临时缓存中以便使用。 - 将两个临时缓存加到一起;并将该字符串复制到
MyString
中。
MyString $= NextArrayValue[i];
- 查找
MyString
变量的地址。 - 查找
NextArrayValue[i]
变量的地址。直接将该值附加到MyString
上。