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

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

子字符串是字符串内的字符序列。例如,字符串 "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)); // output: Paris, Texas!!! 
trace(str.substring(11,15)); // output: Pari

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

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

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

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

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

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

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

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

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

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

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

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

var str:String = "The moon, the stars, the sea, the land" 
trace(str.lastIndexOf("the", 29)); // output: 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."]

有关详细信息,请参阅 使用正则表达式 用于 Adobe Flash Platform 的 ActionScript 3.0 参考

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

String 类提供了使用字符串中的模式的以下方法:

  • 使用 match() search() 方法可查找与模式相匹配的子字符串。

  • 使用 replace() 方法可查找与模式相匹配的子字符串并使用指定子字符串替换它们。

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

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

查找匹配的子字符串

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

var str:String = "The more the merrier."; 
// (This search is case-sensitive.) 
trace(str.search("the")); // output: 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)); // output: 4 
 
str = "The \"more the merrier."; 
trace(str.search(pattern)); // output: -1  
// (Indicates no match, since there is no closing double quotation mark.)

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 = parseFloat(usd) * exchangeRate; 
    const euroSymbol:String = String.fromCharCode(8364); 
    return euro.toFixed(2) + " " + euroSymbol; 
}

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

  • 字符串的匹配部分。

  • 任何捕获的括号组匹配项。按这种方式传递的参数数目因括号匹配项的数目而异。您可以通过检查函数代码中的 arguments.length - 3 来确定括号匹配项的数目。

  • 字符串中匹配开始的索引位置。

  • 完整的字符串。