javascript裏面RegExp的exec函數的總結

       在咱們的前端裏面,常常會用到正則表達式進行檢索字符串,恰好javascript裏面提供RegExp來支持正則表達式,而RegExp對象的主要方法是exec()。 javascript

語法html

RegExpObject.exec(string)
參數 描述
string 必需。要檢索的字符串。

返回值:前端

       返回一個數組,其中存放匹配的結果。若是未找到匹配,則返回值爲 null。java

說明:web

exec() 方法的功能很是強大,它是一個通用的方法,並且使用起來也比 test() 方法以及支持正則表達式的 String 對象的方法更爲複雜。正則表達式

若是 exec() 找到了匹配的文本,則返回一個結果數組。不然,返回 null。此數組的第 0 個元素是與正則表達式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(若是有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(若是有的話),以此類推。除了數組元素和 length 屬性以外,exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。input 屬性則存放的是被檢索的字符串 string。咱們能夠看得出,在調用非全局的 RegExp 對象的 exec() 方法時,返回的數組與調用方法 String.match() 返回的數組是相同的。數組

可是,當 RegExpObject 是一個全局正則表達式時,exec() 的行爲就稍微複雜一些。它會在 RegExpObject 的 lastIndex 屬性指定的字符處開始檢索字符串 string。當 exec() 找到了與表達式相匹配的文本時,在匹配後,它將把 RegExpObject 的 lastIndex 屬性設置爲匹配文本的最後一個字符的下一個位置。這就是說,您能夠經過反覆調用 exec() 方法來遍歷字符串中的全部匹配文本。當 exec() 再也找不到匹配的文本時,它將返回 null,並把 lastIndex 屬性重置爲 0。spa

咱們如今主要來看說明裏面的第三段的內容,code

看個例子:orm

<html>
<body>
<script type="text/javascript">
var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g");
var result;
while ((result = patt.exec(str)) != null)  {
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
 }
document.write(patt.lastIndex);
</script>
</body>
</html>

運行結果以下:

W3School
14
W3School
24
0

能夠看到在全局模式lastIndex會一直增長,直到遍歷該字符串全部的字符,最後變爲0,

因此有一個要注意的是,

若是在一個字符串中完成了一次模式匹配以後要開始檢索新的字符串,就必須手動地把 lastIndex 屬性重置爲 0

示例以下:

var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g");
var result;
  result=patt.exec(str);
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
var aa="W3School sfd sfsf"
var ddResult;
  ddResult= patt.exec(aa);
  document.write(ddResult);

結果以下:

W3School
14
null

之因此最後一個輸出結果爲null,是因爲第一次匹配的結果的lastIndex變爲14了。再去檢索第二個字符串的時候會從14的位置開始,把前面13個字符去跳過去了,因此找不到,咱們要想其從頭看是,只須要在檢索第二個字符串的開頭,讓其LastIndex置爲0

結果就會爲:

W3School
14
W3School

但這只是全局的纔有這個問題,局部的話,沒有這個問題,能夠把上面的例子的全局的去掉,就能夠獲得

var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","");
var result;
  result=patt.exec(str);
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
var aa="W3School sfd sfsf"
var ddResult;
  ddResult= patt.exec(aa);
  document.write(ddResult);

運行的結果以下:

W3School
0
W3School

相關文章
相關標籤/搜索