2013-02-14 23 views
3

匹配使用document.doctype.internalSubset,我有以下字符串,說STR如何使用正則表達式的所有元素document.doctype.internalSubset

<!ENTITY owl "http://www.w3.org/2002/07/owl#" > 
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > 
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > 
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" > 

然後,我用正則表達式提取結果:

result = regex.exec(str); 

預期輸出是其中的數組:

result[0] = owl "http://www.w3.org/2002/07/owl#" 
result[1] = xsd "http://www.w3.org/2001/XMLSchema#" 
... 
result[3] = rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" 

所以,我創建這個正則表達式:

var regex = /(?:<!ENTITY(.*?)>)*/g; 

,這裏是結果,當然,這不是我想要的:

owl "http://www.w3.org/2002/07/owl#" 

誰能幫助我找出錯誤,以及如何解決所有這些問題?

注意,我可以使用s.indexOf()得到的<!ENTITY>,然後的位置,使用s.subString()得到相同的結果,但我現在學習正則表達式,所以我想使用正則表達式。

--------------更新---------------

感謝SUPR,我終於可以計算出錯誤,在我看來,在這種情況下,「*」並不意味着「匹配一次或多次」,所以我們將使用這一個:/(?:<!ENTITY(.*?)>)/g(禁止*),然後循環字符串,直到我們得到所有結果。這裏是源:

var str = '<!ENTITY owl "http://www.w3.org/2002/07/owl#" >' 
    + '<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >' 
    + '<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >' 
    + '<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >' 

var regex = /(?:<!ENTITY(.*?)>)/g; 
var results = []; 

while ((result = regex.exec(str)) != null) { 
    results.push(result[1]); 
} 
console.log(str); 
console.log("-------------------------------"); 
for (var i = 0; i < results.length; i++) { 
    document.write(results[i] + "<br>"); 
} 

來進行測試:http://jsfiddle.net/nxhoaf/jZpHv/

順便說一句,這裏是用s.indexOf()和遞歸我的解決方案:

var str = '<!ENTITY owl "http://www.w3.org/2002/07/owl#" >' 
    + '<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >' 
    + '<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >' 
    + '<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >' 

var getNamespace = function(input) { 
    var result = []; // Store the final result 
    var temp = []; // Store the temporary result 

    // Non trivial case 
    if ((input != null) && (input.length != 0)) { 

     // Get the begin and and index to extract the entity's content 
     var begin = input.indexOf("<!ENTITY"); 
     var end = input.indexOf(">"); 

     if ((begin == -1) || (end == -1) || (begin >= end)) { // not found 
      return null; 
     } 

     // Fix the begin index 
     begin = begin + "<!ENTITY".length; 

     // Get the content and save it to result variable 
     var item = input.substring(begin, end); // ok, get one item 
     // As end > begin, item is always != null 
     item = item.trim(); // Normalize 
     result.push(item); 

     // Continue searching with the rest using 
     // recursive searching 
     temp = getNamespace(input.substring(end + 1)); 

     // Ok, collect all of data and then return 
     if (temp != null) { 
      for (var i = 0; i < temp.length; i++) { 
       result.push(temp[i]); 
      } 
     } 
     return result; 
    } else { // Trivial case 
     return null; 
    } 
} 

// Parse it to get the result 
result = getNamespace(str); 
console.log("*************"); 
for (var i = 0; i < result.length; i++) { 
    document.write(result[i] + "<br>"); 
} 

你可以在這裏進行測試: http://jsfiddle.net/nxhoaf/FNFuG/

+0

你告訴我們什麼你不想要,但沒有告訴我們你想要什麼 – aa8y 2013-02-14 12:13:31

+0

Wh在我想要的是在「我的expexted結果......」:結果[0] =貓頭鷹「http://www.w3.org/2002/07/owl#」,等等... – nxhoaf 2013-02-14 13:05:29

回答

0

新的解決方案

看起來最後的*使表達式消耗整個字符串,即使返回值僅包含第一個匹配。如果您將表情更改爲/(?:<!ENTITY(.*?)>)/g;,則可以多次應用它。正則表達式對象將跟蹤最後一場比賽結束的地方並從那裏繼續。所以:

var regex = /(?:<!ENTITY(.*?)>)/g; 
var results = []; 
while (result = regex.exec(str)) { 
    results.push(result[1]); 
} 

老搗毀解決方案

嘗試使用result = str.match(regex);代替。From MDN docs

如果正則表達式包含g標誌,則該方法返回一個包含所有匹配的數組。如果沒有匹配,則該方法返回null。從同一文檔

var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
var regexp = /[A-E]/gi; 
var matches_array = str.match(regexp); 

// matches_array now equals ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e'] 
+0

我修改了正則表達式來VAR正則表達式= /(?:)/g; !(沒有*符號之前/克了,結果是<!ENTITY貓頭鷹 「http://www.w3.org/2002/07/owl#」>, ... – nxhoaf 2013-02-14 13:11:52

+0

權,沒想到這回整場比賽,而不僅僅是組... – Supr 2013-02-14 13:38:03

+0

謝謝,它的工作!謝謝 – nxhoaf 2013-02-15 09:10:28

0
var arr = Array(); 

通過正則表達式模式

var pattern= /(?:<!ENTITY(.*?)>)*/g; //your pattern 

arr = string.match(pattern) 

希望這會爲你工作..access數組

+0

,但它不工作:( – nxhoaf 2013-02-14 13:12:13

+0

可能是你出了毛病,你這個patter..try變種模式= /(?:)*/g; – sasi 2013-02-14 13:14:28

+0

這裏是結果:http://jsfiddle.net/nxhoaf/BbT4R / – nxhoaf 2013-02-14 13:37:22

相關問題