簡體   English   中英

從JavaScript正則表達式獲取匹配和純字符串數組

[英]Getting an array of matches and plain strings from a JavaScript regular expression

我經常想用正則表達式解析一個字符串,找到所有的匹配以及所有不匹配的字符串,並且所有的字符串都按照原始順序散布,例如

var parsed = regexParse(/{([^}]+)}/g, 'Hello {name}, you are {age} years old');

所以parsed將包含:

0 : "Hello "
1 : match containing {name}, name
2 : ", you are "
3 : match containing {age}, age
4 : " years old"

JavaScript(或一些廣泛使用的庫)中有什么類似於這個regexParse函數的東西嗎? 我寫了我自己的版本,但似乎很明顯,我懷疑必須已經采用“標准”的方式:

var regexParse = function(rx, str) {
  var nextPlain = 0, result = [], match;
  rx.lastIndex = 0;
  for (;;) {
    match = rx.exec(str);
    if (!match) {
      result.push(str.substr(nextPlain));
      break;
    }
    result.push(str.substr(nextPlain, match.index - nextPlain));
    nextPlain = rx.lastIndex;
    result.push(match);
  }
  return result;
};

更新

關於Dennis的回答,起初我認為它無法提供幫助,因為返回數組中的所有值都是字符串。 如何判斷哪些項目是不匹配的文本以及哪些項目來自匹配?

但是一些實驗(無論如何使用IE9和Chrome)都表明,當以這種方式使用split時,它總是交替使用碎片,因此第一個是純文本,第二個是匹配,第三個是純文本,等等。 它遵循這個規則,即使有兩個匹配沒有不匹配的文本散布 - 在這種情況下它輸出一個空字符串。

即使在瑣碎的情況下:

'{x}'.split(/{([^}]+)}/g)

輸出嚴格:

["", "x", ""]

所以如果你知道如何(以及這個假設是否成立)你可以分辨哪個是哪個!

我喜歡使用ES5數組方法 mapforEachfilter 因此,使用我原來的regexParse可以使用typeof i == 'string來檢測哪些項目是不匹配的文本。

split時必須根據返回數組中的位置確定,但這沒關系,因為ES5數組方法傳遞第二個參數,索引,所以我們只需要找出它是奇數(匹配)還是偶數(不匹配)文本)。 例如,如果我們有:

var ar = '{greeting} {name}, you are {age} years old'.split(/{([^}]+)}/g);

現在ar包含:

["", "greeting", " ", "name", ", you are ", "age", " years old"]

從那以后我們可以得到匹配:

ar.filter(function(s, i) { return i % 2 != 0; });

>>> ["greeting", "name", "age"]

或者只是純文本,也刪除空字符串:

ar.filter(function(s, i) { return (i % 2 == 0) && s; });

>>> [" ", ", you are ", " years old"]

我認為你正在尋找帶有捕獲括號的split()

var myString = "Hello 1 word. Sentence number 2.";
var splits = myString.split(/(\d)/); // Hello ,1, word. Sentence number ,2, .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM