5 6 3 6 字串的模式匹配方法

2022-01-23 13:01:24 字數 3472 閱讀 3304

string型別定義了幾個用於在字串中匹配模式的方法。第乙個方法就是macth(),在字串上呼叫這個方法,本質上與呼叫regexp()的exec()方法相同。match()方法只接收乙個引數,要麼是乙個正規表示式,要麼是乙個regexp()物件。例如:

var text="cat,bat,sat,fat";

var pattern=/.at/;

//與pattern.exec(text)相同

var matches=text.match(pattern);

alert(matches.index);//0

alert(matches[0]);//"cat"

alert(pattern.lastindex); //0

這個例子的match()方法  了乙個陣列;如果是呼叫regexp物件的exec()方法並傳遞本例中的字串作為引數,那麼也會得到與此同時的陣列:陣列的第一項是是與整個模式匹配的字串,之後的每一項(如果有)儲存著與正規表示式中的捕獲組 匹配的字串。

另乙個用於查詢模式的方法是search()。這個方法的唯一引數與match()方法的引數相同:由字串或regexp物件指定的乙個正規表示式。search()方法返回字串中的第乙個匹配項的索引;如果沒有找到匹配項,則返回-1。而且,search()方法始終是從字串開頭向後查詢模式。例如:

var text="cat,bat,sat,fat";

var pos=text.search(/at/);

alert(pos);//1

這個例子中的search()方法返回1,即「at」在字串中第一次出現的位置。

為了簡化替換子字串的操作,ecmascript提供了replace()方法。這個方法接收兩個引數:第乙個引數可以是乙個regexp物件或者乙個字串(這個字串不會被轉換成正規表示式),第二個引數可以是字串或者乙個函式。如果第乙個引數是字串,那麼只會替換第乙個子字串。要想替換所有的字串,就需要提供乙個正規表示式,而且要指定全域性(g)標誌,例如:

var text="cat,bat,sat,fat";

var result=text.replace("at","ond");

alert(result);//"cond,bat,sat,fat"

result=text.replace(/at/g,"ond");

alert(result);//"cond,bond,sond,fond"

在這例子中,首先出入replace()方法的是字串「at」和需要替換成的字串「ond」。替換的結果是把「cat」替換成了「cond」,但字串中的其他字元並沒有影響。然後,通過將第乙個引數修改為帶有全域性標誌的正規表示式,就將字串中全部帶有「at」的字元替換成了「ond」。 

如果第二個引數是字串,那麼還可以使用一些特殊字串行,將正規表示式操作得到的值插入到結果中去。下表列出了ecmascript提供的這些特殊字串行。

字串行

替換文字$$$

$&匹配整個模式的字串。與regexp.lastmatch的值相同。

$'匹配的子字串之前的子字串。與regexp.leftcontext值相同。

$`匹配的子字串之後的子字串。與regexp.rightcontext值相同。

$n匹配第n個捕獲的子字串,其中n等於0~9。例如,$1是匹配第乙個捕獲組的子字串,$2是匹配第二個捕獲組的子字串,以此類推。如果正規表示式中沒有定義捕獲組,則使用空字串

$nn匹配第nn個捕獲組的子字串,其中nn等於01~99。例如,$01是匹配第乙個捕獲組的子字串,$02是匹配第二個捕獲組的子字串,以此類推。如果正規表示式中沒有定義捕獲組,則使用空字串。

通過這些特殊的字串行,可以使用最近一次匹配結果中的類容,例如:

var text="cat,sat,bat,fat";

result=text.replace(/(.at)/g,"word($1)");

alert(result);//word(cat),word(sat),word(bat),word(fat)

在此,每個以「at」結尾的單詞都被替換了,替換結果是以「word」後跟一對圓括號,而括號中是被字串行$1所替換的單詞。

replace()方法的第二個引數也可以是個函式。在只有乙個匹配項(即與模式匹配的字串)的情況下,會向這個函式傳遞3個引數:模式匹配項,模式匹配項在字串中的位置和原始字串。在正規表示式中定義了多個捕獲組的情況下,傳遞給函式的引數依次是模式的匹配項、第乙個捕獲組的匹配項、第二個捕獲組的匹配項......,但是最後兩個引數仍然分別是模式的匹配項在字串中位置和原始字串。這個函式應該返回乙個字串,表示應該被替換的匹配項。使用函式作為replace()方法的第二個引數可以實現更加精細的替換操作,例如:

function htmlescape(text)

});}alert(htmlescape("hello world !

")); //hello world !

這裡,我們為插入html**定義了函式htmlescape(),這個函式能夠轉義4個字元:小於符號、大於符號、和號以及雙引號。實現這種轉義的最簡單方式,就是使用正規表示式查詢者幾個字元,然後定義乙個能針對每個匹配的字元返回特定的html實體的函式。

最後乙個與模式匹配有關的方法是split(),這個方法可以基於指定的分隔符將一字串分割成多個字串,並將結果放在乙個陣列中。分隔符可以是字串,也可以是乙個regexp物件(這個方法不會將字串看成正規表示式)。split()方法可以接受可選的第二個引數,用於指定陣列的大小,以便於確保返回的陣列不會超過既定大小。離去:

var colortext="red,blue,green,yellow";

var colors1=colortext.split(",");//["red","blue","green","yellow"]

var colors2=colortext.split(",",2);//["red","blue"]

var colors3=colortext.split(/[^\,]+/);//["",",",",",",",""]

在上例子中,colortext是逗號分隔的顏色字串。基於該字串呼叫了split(",")會得到乙個包含其中顏色名的陣列,用於分隔字串的分隔符是逗號。為了將陣列截短,讓它只包含兩項,可以為split()方法傳遞第二個引數2。最後通過使用正規表示式,還可以取得包含逗號字元的陣列。需要注意的是,在最後一次呼叫split()返回的陣列中,第一項和最後一項是兩個空字串。之所以會這樣,是因為通過正規表示式指定的分隔符出現了字串的開頭(即子字串「red」)和末尾(即子字串「yellow」)。

對split()中正規表示式的支援因瀏覽器而異。儘管對於簡單的模式沒有什麼差別,但對於未發現匹配項以及帶有捕獲組的模式,匹配的行為就不大相同了。以下是幾種常見的差別:

在正規表示式中使用捕獲組時還有其他微妙的差別。在使用這種正規表示式時,一定要在各種瀏覽器下多做一些測試。

13 字串 模式匹配

一般提起字串的相關演算法,就是幾個基本的演算法 賦值strcpy 求長strlen 聯接strcat 比較strcmp和求子串substr。這5個操作相對來說都比較簡單,構成了字串的最小操作集,其他的演算法都可以由這幾個演算法來實現。但是實際應用中,模式匹配index是應用非常廣泛的字串操作,我們傾...

201409 3 字串匹配

試題編號 201409 3 試題名稱 字串匹配 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給出乙個字串和多行文字,在這些文字中找到字串出現的那些行。你的程式還需支援大小寫敏感選項 當選項開啟時,表示同乙個字母的大寫和小寫看作不同的字元 當選項關閉時,表示同乙個字母的大寫和小...

20140903 字串匹配

問題描述 試題編號 201409 3 試題名稱 字串匹配 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給出乙個字串和多行文字,在這些文字中找到字串出現的那些行。你的程式還需支援大小寫敏感選項 當選項開啟時,表示同乙個字母的大寫和小寫看作不同的字元 當選項關閉時,表示同乙個字母...