在字符串中查找子字符串和模式

子字符串是字符串内的字符序列。例如,字符串 "abc" 具有如下子字符串:"""a""ab""abc""b""bc""c"。可使用 ActionScript 的方法来查找字符串的子字符串。

模式是在 ActionScript 中通过字符串或正则表达式定义的。例如,下面的正则表达式定义了一个特定模式:字母 A、B 和 C 的后面跟着一个数字字符(正斜杠是正则表达式的分隔符):

/ABC\d/

ActionScript 提供了在字符串中查找模式的方法,以及使用替换子字符串替换找到的匹配项的方法。随后的章节将介绍这些方法。

正则表达式可定义十分复杂的模式。有关详细信息,请参阅使用正则表达式

子主题

通过字符位置查找子字符串
查找匹配子字符串的字符位置
创建由分隔符分隔的子字符串数组
在字符串中查找模式并替换子字符串

通过字符位置查找子字符串

substr()substring() 方法非常类似。两个方法都返回字符串的一个子字符串。并且两个方法都具有两个参数。在这两个方法中,第一个参数是给定字符串中起始字符的位置。不过,在 substr() 方法中,第二个参数是要返回的子字符串的“长度”,而在 substring() 方法中,第二个参数是子字符串的“结尾”处字符的位置(该字符未包含在返回的字符串中)。此示例显示了这两种方法之间的差别:

var str:String = "Hello from Paris, Texas!!!";
trace(str.substr(11,15)); // 输出:Paris, Texas!!!
trace(str.substring(11,15)); // 输出:Pari

slice() 方法的功能类似于 substring() 方法。当指定两个非负整数作为参数时,其运行方式将完全一样。但是,slice() 方法可以使用负整数作为参数,此时字符位置将从字符串末尾开始向前算起,如下例所示:

var str:String = "Hello from Paris, Texas!!!";
trace(str.slice(11,15)); // 输出:Pari
trace(str.slice(-3,-1)); // 输出:!!
trace(str.slice(-3,26)); // 输出:!!!
trace(str.slice(-3,str.length)); // 输出:!!!
trace(str.slice(-8,-3)); // 输出:Texas

可以结合使用非负整数和负整数作为 slice() 方法的参数。

查找匹配子字符串的字符位置

可以使用 indexOf()lastIndexOf() 方法在字符串内查找匹配的子字符串,如下例所示:

var str:String = "The moon, the stars, the sea, the land";
trace(str.indexOf("the")); // 输出:10

请注意,indexOf() 方法区分大小写。

可以指定第二个参数以指出在字符串中开始进行搜索的起始索引位置,如下所示:

var str:String = "The moon, the stars, the sea, the land"
trace(str.indexOf("the", 11)); // 输出:21

lastIndexOf() 方法在字符串中查找子字符串的最后一个匹配项:

var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the")); // 输出:30

如果为 lastIndexOf() 方法提供了第二个参数,搜索将从字符串中的该索引位置反向(从右到左)进行:

var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the", 29)); // 输出:21

创建由分隔符分隔的子字符串数组

可使用 split() 方法创建子字符串数组,该数组根据分隔符进行划分。例如,可以将逗号分隔或制表符分隔的字符串分为多个字符串。

以下示例说明如何使用“与”字符 (&) 作为分隔符,将数组分割为多个子字符串:

var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65";
var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]

split() 方法的第二个参数是可选参数,该参数定义所返回数组的最大大小。

此外,还可以使用正则表达式作为分隔符:

var str:String = "Give me\t5."
var a:Array = str.split(/\s+/); // a == ["Give","me","5."]

有关详细信息,请参阅使用正则表达式和《ActionScript 3.0 语言和组件参考》。

在字符串中查找模式并替换子字符串

String 类提供了在字符串中处理模式的以下方法:

随后的章节将介绍这些方法。

您可以使用字符串或正则表达式定义在这些方法中使用的模式。有关正则表达式的详细信息,请参阅使用正则表达式

查找匹配的子字符串

search() 方法返回与给定模式相匹配的第一个子字符串的索引位置,如下例所示:

var str:String = "The more the merrier.";
// (此搜索区分大小写。)
trace(str.search("the")); // 输出:9

您还可以使用正则表达式定义要匹配的模式,如下例所示:

var pattern:RegExp = /the/i;
var str:String = "The more the merrier.";
trace(str.search(pattern)); // 0

trace() 方法的输出为 0,因为字符串中第一个字符的索引位置为 0。在正则表达式中设置了 i 标志,因此搜索时不区分大小写。

search() 方法仅查找一个匹配项并返回其起始索引位置,即便在正则表达式中设置了 g(全局)标志。

下例展示一个更复杂的正则表达式,该表达式匹配被双引号引起来的字符串:

var pattern:RegExp = /"[^"]*"/;
var str:String = "The \"more\" the merrier.";
trace(str.search(pattern)); // 输出:4

str = "The \"more the merrier.";
trace(str.search(pattern)); // 输出:-1
// (指示没有任何匹配项,因为不存在任何结束双引号。)

match() 方法的工作方式与此类似。它搜索一个匹配的子字符串。但是,如果在正则表达式模式中使用了全局标志(如下例所示),match() 将返回一个包含匹配子字符串的数组:

var str:String = "bob@example.com, omar@example.org";
var pattern:RegExp = /\w*@\w*\.[org|com]+/g;
var results:Array = str.match(pattern);

results 数组被设置为以下内容:

["bob@example.com","omar@example.org"]

有关正则表达式的详细信息,请参阅使用正则表达式

替换匹配的子字符串

您可以使用 replace() 方法在字符串中搜索指定模式并使用指定的替换字符串替换匹配项,如下例所示:

var str:String = "She sells seashells by the seashore.";
var pattern:RegExp = /sh/gi;
trace(str.replace(pattern, "sch"));
    //sche sells seaschells by the seaschore. 

请注意,在本例中,因为在正则表达式中设置了 i (ignoreCase) 标志,所以匹配的字符串是不区分大小写的;而且因为设置了 g (global) 标志,所以会替换多个匹配项。有关详细信息,请参阅使用正则表达式

可以在替换字符串中包括以下 $ 替换代码。下表中显示的替换文本将被插入并替换 $ 替换代码:

$ 代码

替换文本

$$

$

$&

匹配的子字符串。

$`

字符串中位于匹配的子字符串前面的部分。该代码使用左单直引号字符 (`) 而不是单直引号 (') 或左单弯引号 (')。

$'

字符串中位于匹配的子字符串后的部分。该代码使用单直引号 (')。

$n

第 n 个捕获的括号组匹配项,其中 n 是 1-9 之间的数字,并且 $n 后面没有十进制数字。

$nn

第 nn 个捕获的括号组匹配项,其中 nn 是一个十进制的两位数 (01-99)。如果未定义第 nn 个捕获内容,则替换文本为空字符串。

例如,下面说明了如何使用 $2$1 替换代码,它们分别表示第一个和第二个匹配的捕获组:

var str:String = "flip-flop";
var pattern:RegExp = /(\w+)-(\w+)/g;
trace(str.replace(pattern, "$2-$1")); // flop-flip

也可以使用函数作为 replace() 方法的第二个参数。匹配的文本将被函数的返回值替换。

var str:String = "Now only $9.95!";
var price:RegExp = /\$([\d,]+.\d+)+/i;
trace(str.replace(price, usdToEuro));

function usdToEuro(matchedSubstring:String, 
capturedMatch1:String,
index:int,
str:String):String { var usd:String = capturedMatch1; usd = usd.replace(",", ""); var exchangeRate:Number = 0.853690; var euro:Number = usd * exchangeRate; const euroSymbol:String = String.fromCharCode(8364); return euro.toFixed(2) + " " + euroSymbol; }

在使用函数作为 replace() 方法的第二个参数时,将向该函数传递如下参数:


Flash CS3

 

评论添加到页面后给我发送电子邮件 | 评论报告

当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000084.html