RegExp无法读取HTML文件

ndu*_*ger 6 javascript regex node.js

首先,我知道大多数RegExp问题是如何进行的; 这不是其中之一,"请写我的代码"问题.

我的困惑在于,我RegExp在regexr上工作,在使用chrome的dev工具进行轮询时document.body.textContent,而不是在我在io.js中读取它之后的HTML文件.

io.js是版本1.5.1,在Windows 8上运行

为什么它会在列出的两个地方都有效,但在io.js却没有?我没有考虑到io.js读取文件的内容吗?

RegExp应该匹配" @{each ___->___} text and line breaks @{/each}",因为它在下面的链接中,但相反,它返回null

以下是我正在尝试使用的内容:http://regexr.com/3aldk

正则表达式:

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

JS(示例):

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

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>
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了一些显而易见的东西,比如一个角色,背面出现但没有服过一次?

CSᵠ*_*CSᵠ 6

这里的问题在于规范实现之间的界限.

ECMAscript 5.1规范声明:

-字符可以从字面上被处理,或者它可以表示的范围内.如果它是ClassRanges的第一个或最后一个字符,范围规范的开始或结束限制,或者紧跟范围规范,则按字面处理.

Regular-Expressions.info指出:

在无法形成范围的字符类中的其他位置处的连字符可能被解释为文字或错误.正则表达式的味道与此非常不一致.

结论:

在字符类中包含短划线减号的安全方法-是:

  • 逃避它(例如[a-zA-Z0-9\->.])
  • 将它作为第一个字符.在课堂上(例如[-.>a-zA-Z0-9])
    • 例外:在一个否定的类中,它排在第二位,就在它之后^(例如[^-.>a-zA-Z0-9])
  • 把它放在班上的最后一个(例如[a-zA-Z0-9.>-])

一般编码指南建议首先放置范围并使用连字符结束字符类,这样可以避免歧义并有助于提高可读性.


总结一下,您的RegEx应该成为:

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

作为补充提示:

你也可以重写[\s\S](任何空格字符或任何非空白字符.)[^](不是没有)

这将使您获得以下RegEx:

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

JavaScript ...视为[^]与任何单个字符匹配的否定空字符类.- 来源

  • 这是假的,连字符可以在一个范围或一个速记字符类之后而不被转义:`[az-2]`被允许像`[\ w-2]`.`[^]`是一种旧语法,并非所有javascript实现都支持. (2认同)