Vyhledávání na webu

javascript - RegExp nefunguje při čtení HTML souboru


Především vím, jak většina otázek na regulární výrazy vypadá; a toto není jedna z těch otázek typu „prosím, napište můj kód“.

Má zmatení spočívá v tom, že můj RegExp funguje na regexr a v nástrojích pro vývojáře Chrome při kontrolování document.body.textContent, ale ne na HTML souboru poté, co jsem jej načetl v io.js.

io.js je verze 1.5.1, běží na Windows 8

Proč by to fungovalo na obou uvedených místech, ale ne v io.js? Nezohledňuji něco, co io.js dělá při čtení souborů?

Můj RegExp by měl odpovídat "@{each ___->___} text a zalomení řádků @{/each}", tak jak je to v odkazu níže, ale místo toho vrací null

Tady je to, co se snažím použít: http://regexr.com/3aldk

RegExp :

/@\{each ([a-zA-Z0-9->.]*)\}([\s\S]*)@\{\/each}/g

JS (Příklad):

fs.readFile('view.html', {encoding:'utf8'}, function(error, html) {
    console.log(html.match(myRegExp)); // null
});

HTML :

<!doctype html>
<html>
    <head>
        <title>@{title}</title>
    </head>
    <body>
        <h1>@{foo.bar}</h1>
        <p>
            Lorem ipsum dolor sit amet, @{foo.baz.hoo}
        </p>
        @{each people->person}
            <div>
                <b>@{person.name}:</b> @{person.age}
            </div>
        @{/each}
    </body>
</html>

Chybí mi něco zřejmého, například postava, která je přítomna na zadní straně, ale nikdy nebyla použita?

Odpověď č. 1

Problém zde spočívá na jemné hranici mezi specifikací a implementacemi.

Specifikace ECMAscript 5.1 uvádí, že:

Znak - může být interpretován doslovně nebo může označovat rozsah. Je interpretován doslovně, pokud je prvním nebo posledním znakem ClassRanges, počátečním nebo koncovým mezníkem specifikace rozsahu, nebo pokud následuje hned po specifikaci rozsahu.

Stránka Regular-Expressions.info uvádí:

Pomlčky na jiných místech v znakových třídách, kde nemohou tvořit rozsah, mohou být interpretovány jako doslovné znaky nebo jako chyby. Různé varianty regulárních výrazů jsou v tomto ohledu poměrně nekonzistentní.

Závěry :

Bezpečný způsob zahrnutí pomlčky - do množiny znaků je buď:

  • únik z něj (např. [a-zA-Z0-9\->.])
  • umístěním jako první znak ve třídě (např. [-.>a-zA-Z0-9])

    • výjimka: v negované třídě jde na druhé místo, hned za ^ (např. [^-.>a-zA-Z0-9])
  • umístění na konec v třídě (např. [a-zA-Z0-9.>-])

Obecné pokyny pro kódování doporučují umístit vaše rozsahy nejdříve a zakončit znakovou třídu spojovníkem, to se vyhýbá nejasnostem a zlepšuje čitelnost.

Shrnuto, váš RegEx by měl být:

/@\{each ([a-zA-Z0-9>.-]*)\}([\s\S]*)@\{\/each}/g

Jako další tip:

můžete také přepsat [\s\S] (jakýkoli bílý znak nebo jakýkoli nepřebytečný znak) do [^] (není nic)

co by vás přivedlo k následujícímu regulárnímu výrazu:

/@\{each ([a-zA-Z0-9>.-]*)\}([^]*)@\{\/each}/g

JavaScript ... považuje [^] za negovanou prázdnou znakovou třídu, která odpovídá libovolnému jednomu znaku. - zdroj