3

document.doctype.internalSubset を使用すると、次の文字列、たとえば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#" >

次に、正規表現を使用して結果を抽出します。

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を使用してand >の位置を取得し、次にs.subString()を使用して同じ結果を取得できることに注意してください。ただし、現在正規表現を学習しているので、正規表現を使用したいと考えています。

- - - - - - - アップデート - - - - - - - -

Supr のおかげで、ようやくエラーを突き止めることができました。この場合、「*」は「1 回または複数回一致する」という意味ではないように思われるため、 を使用する代わりに、これを/(?:<!ENTITY(.*?)>)*/g使用します: /(?:<!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/

4

2 に答える 2

0

新しいソリューション

*戻り値に最初の一致のみが含まれている場合でも、最後の式では文字列全体が消費されるようです。式をに変更すると/(?:<!ENTITY(.*?)>)/g;、複数回適用できます。正規表現オブジェクトは、最後の一致が終了した場所を追跡し、そこから続行します。それで:

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

古くて破壊されたソリューション

result = str.match(regex);代わりに使用してみてください。MDNドキュメントから:

正規表現に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']
于 2013-02-14T12:18:15.407 に答える
0
var arr = Array();

正規表現パターンを渡す

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

arr = string.match( pattern )

これがうまくいくことを願っています..その配列にアクセスしてください

于 2013-02-14T12:33:57.023 に答える