[TOC]
Haxe庫中操作String的類主要有三個。最常見的類在String類本身中,然后再StringTools類中包含一些,其余的就在StringBuf類中,用在從一些小的字符串創建非常大的字符串。
# String類
* * * * *
String類中提供的許多方法處理字符串通常是將字符串當作字符的數組來處理。這里提供大量的方法來搜索和替換部分字符串就像在數組中做的那樣。如下表:
|String字段|描述|
| -- | -- |
|length:Int|返回字符長度;屬性只讀。轉義字符,包括正斜線,都記作一個字符|
|charAt(index:Int):String|返回指定位置的字符|
|charCodeAt(index:Int):Int|返回指定位置字符的ASCII表示|
|indexOf(value:String,?startIndex:Int):Int|返回給定字符串或者字符從指定位置之后第一次出現的位置|
|lastIndexOf(value:String,?startIndex:Int):Int|返回反向搜索指定位置后第一次出現給定字符串或者字符的位置|
|split(delimiter:String):Array<String>|分隔字符串為一個數組,使用指定的字符或者字符串|
|substr(pos:Int,?len:Int):String|返回字符串的一部分|
|toLowerCase():String|返回所有字符串的小寫|
|toUpperCase():String|返回所有字符串的大寫|
|toString():String|返回字符串的字符串表現|
|static fromCharCode(code:Int):String|轉換傳遞的數值碼為一個等價的字符|
## 從一個String提取字符
訪問字符串指定位置的字符可以使用 charAt ,charCodeAt 和 substr 方法。charAt 和 charCodeAt 方法可以返回指定位置的單個字符;charAt 會返回字符串的字符表現,而charCodeAt會返回Int類型的ASCII表現。substr方法接受一個第二個參數,決定了要返回字符的長度。
~~~
var newStr : String = str.charAt(3); // 返回 `e`
var newInt : Int = str.charCodeAt(3); // 返回 101
var newStr : String = str.substr(2, 4); // 返回 `Xe a`
~~~
## 搜索字符串
多數情況下,你可能需要在知道想返回那一部分之前搜索一個字符串。例如,可能解析一個配置文件獲得屬性和值并存儲他們到一個Map,而屬性作為鍵。要搜索一個字符串,可以使用 indexOf 方法,需要傳遞你要在字符串中搜索的字符或者字符串。也可以提供第二個參數,定位開始搜索的位置,但這是可選的。當字符或者字符串在其中被找到,將會返回其位置,如果沒有找到其實例,那么返回 - 1。
~~~
var location : Int = str.indexOf(“e”); // 返回 3
var location : Int = str.indexOf(“e”, 4); // 返回 10
var location : Int = str.indexOf(“e”, 11); // 返回 -1
~~~
就像通過 indexOf 搜索一個字符串,還可以反向執行同樣的功能,從尾部開始搜索,使用 lastIndexOf 方法:
~~~
var location : Int = str.lastIndexOf(“e”); // will return 10 from “haXe and Neko”
~~~
當搜索字符串時,通常知道字符串長度會有助于我們,可以通過 length 屬性進行查詢:
~~~
var lengthOfString : Int = str.length; // will return 13 from “haXe and Neko”
~~~
## 字符串到數組的轉換
最終,如果對字符串執行函數把它當作一個數組似乎還不夠,你還可以轉換字符串成為實際的字符數組(Array<String>),可以使用 split 方法。 split 方法只需要一個參數:一個分隔符。分隔符是一個字符或者字符串代表每個項中間的分隔。因此,在一個使用逗號作為分隔符的字符串中,使用逗號作為分隔符會提取它們并保存到數組:
~~~
var items : String = “item1,item2,item3”;
var itemArray : Array < String > = items.split(“,”);
~~~
可以使用你希望的任何分隔符,但是分隔符會在split后被丟棄。
## 數組到字符串的轉換
一旦對在數組中的每個項執行了必要的操作,可以轉換它回到字符串,使用數組中的 join 方法。 join 會以分隔符參數來把項連在一起然后返回新的連接后的字符串:
~~~
var strArray : Array < String > = [“item1”,”item2”,”item3”];
var wholeStr : String = strArray.join(“,”); // will return “item1,item2,item3”
~~~
這里是一個例子,解析一個字符串的屬性和值到一個Map。輸入代碼到一個新的文件然后保存為 StringParsing.hx :
~~~
class StringParsing
{
public static function main()
{
var configStr: String = "item1=val1&item2=val2";
var keyStr: String;
var valStr: String;
var mapProps:Map<String, String> = new Map();
var prevKeyLoc: Int = 0;
var curKeyLoc: Int = 0;
var curValLoc: Int = 0;
curKeyLoc = configStr.indexOf("=");
curValLoc = configStr.indexOf("&");
keyStr = configStr.substr(0, curKeyLoc);
valStr = configStr.substr(curKeyLoc + 1, curValLoc - curKeyLoc - 1);
mapProps.set(keyStr, valStr);
prevKeyLoc = curKeyLoc;
curKeyLoc = configStr.indexOf("=", prevKeyLoc + 1);
keyStr = configStr.substr(curValLoc + 1, curKeyLoc - curValLoc - 1);
valStr = configStr.substr(curKeyLoc + 1, configStr.length - curKeyLoc - 1);
mapProps.set(keyStr, valStr);
trace(mapProps.get("item1"));
trace(mapProps.get("item2"));
}
}
~~~
main 函數提供一些臨時變量來存儲最近搜索的位置。當你遍歷 configStr變量中的字符串時,發現開始和結尾的字符串屬性和值是成對的。屬性名和屬性值被賦值操作符(=)分隔,兩個屬性之間被(&)分隔。通過這個信息,可以搜索每個記號的位置然后通過定位賦值操作符提取其中的信息用于Map對象。
# StringTools類
* * * * *
StringTools 類 提供一些簡單的方法用來整理字符串或者轉換他們到安全的格式。它們有的可以從應用程序使用中提交的字符串的開頭或者結尾刪除錯誤的空格。或者你準備從互聯網上傳輸的字符串,所以它不能在交付的過程中損壞,或者只是簡單的存儲字符串到一個文件或數據庫并希望提前準備。無論是什么,StringTools 可以提供相關幫助。
方法見下表:
|StringTools方法|描述|
| -- | -- |
|baseDecode(s:String, base:String):String|返回一個encode字符串的decode版本,通過一個指定的base(必須是2的N次方)|
|baseEncode(s:String, base:String):String|返回字符串的encode形式,通過一個指定的base(必須是2的N次方)|
|endsWith(s:String, end:String):Bool|如果以給定的字符串或字符結尾則返回true|
|hex(n:Int, ?digits: Int):String|編碼一個數值為16進制形式,帶有一個可選的左側補位的0的數量|
|htmlEscape(s:String):String|返回一個字符串的副本,所有必須的標記避開被HTML瀏覽器顯示|
|htmlUnescape(s:String):String|返回一個未避開的htmlEscape字符串的副本|
|isSpace(s:String, pos:Int):Bool|指定位置字符串如果是空白字符則返回true|
|lpad(s: String, c:String, l:Int):String|返回一個左側通過給定字符或者字符串附加指定次數的字符串的副本|
|ltrim(s:String):String|返回一個左側所有空白字符被移除的字符串的副本|
|replace(s:String, sub:String, by:String):String|返回一個原目標字符或字符串被新的字符或字符串替換之后的字符串副本|
|rpad(s:String, c:String, l:Int):String|返回一個所有右側通過給定字符串或者字符附加指定次數的字符串副本|
|rtrim(s:String):String|返回一個右側所有空白字符串被移除的字符串副本|
|startsWith(s:String, start:String):Bool|如果以給定的字符或字符串開始則返回true|
|trim(s:String):String|返回一個兩側空白字符均被移除的字符串副本|
|urlDecode(s:String):String|返回一個解碼的URL-Encode字符串的副本|
|urlEncode(s:String):String|返回一個encode之后的URL的字符串副本|
## 處理不需要的空格
檢索字符串時常會發現不需要的空格。最丑的是經常會在字符串的開頭或結尾,可能會導致你的字符串算法出現意外。幸運的是,StringTools 提供一些方法來處理這些討厭的字符。
可以檢查是否一個字符在字符串中是一個空白字符,使用 isSpace 方法。這個方法接受你要測驗的字符串作為第一個參數,然后一個希望或者不希望空白的位置作為第二個參數。如果該位置的字符確實是一個空白,那么布爾值 true 會被返回:
~~~
var tmp = StringTools.isSpace(myStr, 4); // returns true from “haXe and Neko”
~~~
把難看的空白從字符串的開頭或者結尾移除可以執行 trim 方法,或者 ltrim和rtrim 。trim方法移除兩邊的空白,而ltrim和rtrim如他們的名字,分別移除左側和右側的空白。這三個方法都會移除存在的每個空白,即使有無數個。
~~~
StringTools.trim(myStr);
~~~
## 更多字符串操作
可以驗證字符串的開頭或者結尾是通過 startsWith 和 endsWith 方法。第一個參數是準備驗證的字符串,一個字符串或者多個對比字符來作為第二個參數。
~~~
var isValid : Bool = StringTools.startsWith(myStr, “haXe”); // 返回true
isValid = StringTools.endsWith(myStr, “rocks”); // 返回 false
~~~
有時候,可能需要添加字符到字符串的結尾,那么就以添加到一個數據的字段為例。可以使用lpad 和rpad 方法。二者都需要要補充的字符串,和要添加到其上的字符串,和添加字符的數量:
~~~
var paddedString : String = StringTools.lpad(myStr, “ “, 20);
~~~
最后,你可以替換原字符串中的部分字符或字符串使用 replace 方法。當交換一個字符串中的分隔符為另外不同的字符時會常常用到:
~~~
var oldStr : String = “item1,item2,item3”;
var newStr : String = StringTools.replace(oldStr, “,”, “;”);
~~~
## 為web進行字符串編碼
StringTools類提供一些方法來維護字符串可以讓他們在互聯網上安全的進行傳輸。如果通過GET方法傳輸你的字符串,可能需要編碼他們以使字符串不會在傳輸的過程中被修改,并保證總是在一個塊中。在Haxe中可以使用 urlEncode 方法:
~~~
var encodedStr : String = StringTools.urlEncode(“String to send “);
~~~
檢索一個編碼的字符串在另一端可以使用 urlDecode 方法進行解碼:
~~~
var newStr : String = StringTools.urlDecode(receivedStr);
~~~
如果想要顯示字符串到瀏覽器,一些要顯示的標記可能被讀為HTML標記,所以需要進行轉義。可以使用 htmlEscape 方法:
~~~
var escapedStr : String = StringTools.htmlEscape(“String to display”);
~~~
同樣,可以轉變這個方法的影響,使用 htmlUnescape方法:
~~~
var normalStr : String = StringTools.htmlUnescape(escapedStr);
~~~
# StringBuf類
* * * * *
StringBuf 類提供開發者一些干凈的方式從較小的字符串和字符構造字符串。StringBuf 的一些方法如下:
|StringBuf方法|描述|
| -- | -- |
|add(?x:Dynamic):Void|添加一個對象的字符串形式到StringBuf字符串|
|addChar(c:Int):Void|添加一個ASCII字符到StringBuf字符串|
|addSub(s:String, pos:Int, ?len:Int):Void|添加一個字符串的部分從給定的位置和長度,到StringBuf字符串|
|toString():String|返回StringBuf對象中的字符串|
StringBuf 類必須在使用之前實例化:
~~~
var myString : StringBuf = new StringBuf();
~~~
一旦StringBuf 類實例化后,可以添加你的小的字符串到 StringBuf 對象,使用 add 方法。 add 方法可以攜帶任何類型的對象,然后提取額一個字符串的表現形式,如果它暴露出一個:
~~~
myString.add(someObject);
myString.add(“more text”);
~~~
如果你要添加到StringBuf 對象的是字符串的一部分,可以使用 addSub 方法。 這個方法和String 類的 substr 方法幾乎完全相同:
~~~
myString.addSub(“Big long text string “, startPos, endPos);
~~~
甚至可以添加ASCII字符,在被添加到StringBuf對象前將被轉換為字符表現形式。可以使用 addChar方法:
~~~
myString.addChar(101); // adds the character `e` to the StringBuf object
~~~
最后,可以從StringBuf對象提取字符串,使用 toString 方法:
~~~
var str : String = myString.toString();
~~~
- 本書目錄
- 第一章:Haxe介紹
- 互聯網開發的一個問題
- Haxe是什么,為什么產生
- Haxe編譯工具
- Haxe語言
- Haxe如何工作
- 那么Neko是什么
- Haxe和Neko的必須條件
- 本章摘要
- 第二章:安裝、使用Haxe和Neko
- 安裝Haxe
- 使用Haxe安裝程序
- 在Windows上手動安裝Haxe
- Linux上手動安裝Haxe
- 安裝Neko
- Windows上手動安裝Neko
- 在Linux上安裝Neko
- Hello world! 一式三份
- 編譯你的第一個Haxe應用
- 你的程序如何編譯
- HXML編譯文件
- 編譯到Neko
- 編譯為JavaScript
- 程序結構
- 編譯工具開關
- 本章摘要
- 第三章:基礎知識學習
- Haxe層級結構
- 標準數據類型
- 變量
- 類型推斷
- 常數變量
- 簡單的值類型
- 浮點類型
- 整型
- 選擇數值類型
- 布爾類型
- 字符串類型
- 抽象類型
- Void 和 Null
- 動態類型
- unknown類型
- 使用untyped繞過靜態類型
- 注釋代碼
- 轉換數據類型
- Haxe數組
- Array
- List
- Map
- Haxe中使用日期時間
- 創建一個時間對象
- Date組件
- DateTools類
- 操作數據
- 操作符
- Math類
- 使用String函數
- 本章摘要
- 第四章:信息流控制
- 數據存放之外
- 條件語句
- if語句
- switch語句
- 從條件語句返回值
- 循環
- while循環
- for循環
- 循環集合
- Break和Continue
- 函數
- 類的函數
- 局部函數
- Lambda類
- 本章摘要
- 第五章:深入面向對象編程
- 類和對象
- 實例字段
- 靜態字段
- 理解繼承
- Super
- 函數重載
- 構造器重載
- toString()
- 抽象類和抽象方法
- 靜態字段,實例變量和繼承
- 繼承規則
- 使用接口
- 高級類和對象特性
- 類的實現
- 類型參數
- 匿名對象
- 實現動態
- Typedef
- 擴展
- 枚舉
- 構造器參數
- 本章摘要
- 第六章:組織你的代碼
- 編寫可重用代碼
- 使用包
- 聲明一個包
- 隱式導入
- 顯式導入
- 枚舉和包
- 類型查找順序
- 導入一個完整的包
- 導入庫
- Haxe標準庫
- Haxelib庫
- 其他項目中的庫
- 外部庫
- 使用資源
- 文檔化代碼
- 離線文檔
- 在線文檔
- 單元測試
- haxe.unit包
- 編寫測試
- 本章摘要
- 第七章:錯誤調試
- trace函數
- trace輸出
- haxe的trace和ActionScript的trace
- 異常
- 異常處理
- CallStack和ExceptionStack
- 異常管理類
- 創建完全的異常處理類
- 異常類代碼
- 本章摘要
- 第八章:跨平臺工具
- XML
- XML剖析
- Haxe XML API
- 正則表達式
- EReg類
- 模式
- 定時器
- 延遲動作
- 隊列動作
- MD5
- 本章摘要
- 第九章:使用Haxe構建網站
- Web開發介紹
- Web 服務器
- 使用Web服務器發布內容
- HTML速成課程
- Haxe和HTML的區別
- NekoTools Web Server
- Apache安裝mod_neko
- Windows安裝Apache和mod_neko
- Linux安裝Apache和Mod_Neko
- 第一個Haxe網站
- 使用Neko作為網頁Controller
- neko.Web類
- Neko作為前端控制器
- 本章摘要
- 第十章:使用模板進行分離式設計
- 什么是模板
- Template類
- Template語法
- 使用資產
- 何時在模板中使用代碼
- 服務器端模板的Templo
- 安裝Templo
- 使用Templo
- haxe.Template和mtwin.Templo表達式上的區別
- Attr表達式
- Raw表達式
- 邏輯表達式
- 循環表達式
- set, fill, 和 use表達式
- Templo中使用宏
- 手動編譯模版
- 第十一章:執行服務端技巧
- 第十二章:使用Flash構建交互內容
- 第十三章:使用IDE
- 第十四章:通過JavaScript制作更多交互內容
- 第十五章:通過Haxe遠程通信連接所學
- 第十六章:Haxe高級話題
- 第十七章:Neko開發桌面應用
- 第十八章:用SWHX開發桌面Flash
- 第十九章:多媒體和Neko
- 第二十章:使用C/C++擴展Haxe
- 附加部分