字串的模式匹配

2022-03-14 19:28:46 字數 3210 閱讀 7005

承上啟下

對於上篇中@samaritains給的意見,底下查了一下,發現match()這個方法用在那裡真的是太合適了。

var sum = document.getelementbyid('sum');

var click = document.getelementbyid('click');

click.addeventlistener('click',function

add()

alert(c);

},false);

首先match返回的是乙個陣列,而且對於文字框輸入的格式沒有了太多限制,只要輸入的2個數字不是緊挨著的(當然中間也不可以用數字的),那麼就可以得到想要的結果。samaritains的一句話猶如海港的燈塔,指明了方向。既然提到了match,順便雜談下字串的匹配。

字串的模式匹配

1.match與字串的羈絆

match() 方法將檢索字串 stringobject,以找到乙個或多個與 regexp 匹配的文字,並返回乙個陣列。match()只接受乙個引數,要麼是正規表示式,要麼是乙個regexp物件。

match() 方法很大程度上依賴regexp是否具有g標誌。沒有g標誌的話,這個方法只能在字串中執行一次匹配。

var str = 'hello world23o31';

var pat = /.o/;

var pat1 = /\d+/;

console.log(str.match(pat));//['lo']

console.log(str.match(pat1));//['23']

得到匹配結果的同時,也在陣列中存放了2個屬性資訊,包含index和input。

console.log(str.match(pat).index);//1

console.log(str.match(pat1).index);//11

再看下有g標誌的匹配

var str = 'hello world23o32';

var pat = /.o/g;

var pat1 = /\d+/g;

console.log(str.match(pat));//["lo","wo","3o"]

console.log(str.match(pat1));//["23","31"]

很明顯,match() 方法將執行全域性檢索,找到 字串中的所有匹配子字串。如果沒有找到任何匹配的子串,則返回 null。如果找到了乙個或多個匹配子串,則返回乙個陣列。不過全域性匹配返回的陣列與前者大不相同,它沒有 index 屬性或 input 屬性,也就是說使用index和input會提示undefined。這一點是與exec()最大的區別了,exec()無論是不是在全域性檢索的情況下都會把index和input,當然還有lastindex存放到陣列中,這個就不細說了。所以如果想在全域性檢索中獲取匹配項的資訊,可以使用exec()。

2.search()

search()方法很簡單,就是返回與正規表示式或者字串查詢內容匹配的第乙個子字串的位置。如果沒有匹配項,則會返回-1。

var str = 'abcdef';

console.log(str.search('c')); //

2console.log(str.search('d')); //

-1console.log(str.search(/d/i));//

3

其引數只有乙個,可以是字串,也可以是regexp物件。個人認為search()類似match()的子功能,只是沒有匹配項時返回的結果不同。

3.split()

從字面就可以看出這是個分割的方法,基於制定的分隔符將乙個字串分割成多個字串,並將結果放在陣列中。其中有2個引數,第乙個為必選,可以使字串或者正規表示式,第二個引數為可選,為乙個整數,標識限制返回的片段,也就是陣列的長度。

var str = "1234";

var str1 = "a、bd、c";

var arr = str.split("");

var arr1 = str1.split("、");

var arr2 = str1.split("、",2);

console.log(arr);//['1','2','3','4']

console.log(arr1);//['a','bd','c']

console.log(arr2);//['a','bd']

對於str1的分割應該都還好理解,就是簡單的把"、"去掉,然後把由「、」隔開的每個字串依次放到乙個陣列中,後面的2規定了新陣列的長度。而第乙個用空字串進行分割,相當於把每個字元進行分開,得到由每個字元組成的陣列。如果我在「」中加乙個空格或者其他與1234不同的字元,得到的結果就是['1234'],這是因為在str中沒有找到匹配的項,以至於split()會按照沒有傳參進行分割,split()在沒有引數的情況下返回的陣列包含乙個元素,該元素是原字串。

通過split()函式可以獲取一些想要的東西,比如我前面寫的那個疊加,比如我想要通過qq郵箱獲取到qq號碼,再比如我想獲取某個手機號的後四位。就說最後乙個例子吧。

<

input

id="num"

type

="text"

/>

<

input

id="n"

type

="text"

/>

<

input

type

="button"

onclick

="num()"

value

="獲取手機號後四位"

/>

先列出2個文字框,第乙個為輸入的手機號,另乙個為手機號後四位。

function

num()

這樣就很容易得到了。

4.靈魂般的replace()

對於replace(),簡單一看就是替換。可以傳入倆個引數,第乙個引數可以是字串也可以是正則物件,第二個引數可以使字串也可以是函式。由於它的第二個引數可以傳入函式,導致其具有很強的靈活性,應用的範圍很廣。該方法並不改變呼叫它的字串本身,而只是返回替換後的字串。在這就不多介紹了,因為內容太多,就單獨拿出來寫了。

結尾這次寫的有些倉促,不太詳細。在週日之前會把replace()函式和match()與exec()的區別會詳細的羅列出來。

字串模式匹配

include include include include include includeusing namespace std inline unsigned int64 getclock const char min a const int characters 26 int shiftta...

字串模式匹配

子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。設有2 個串 主串 s和子串 t,串的簡單模式匹配演算法是 從主串 s 中的第乙個字元開始和子串 t中的第乙個字元比較,分別用i和 j 指示s串和 t串中正在比較的字元的位置。若相等,則繼續逐個比較後續字元 否則從主串 s的第二...

字串模式匹配

bf演算法 我們常用的暴力演算法,時間複雜度o n2 o n 2 演示 int bf const char text,const char pattern if flag return 1 return 0 kmp演算法 基於bf演算法的優化,他根據字串出現字首與字尾相同的情況進行優化 假設這裡sa...