[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
- 附加部分