正则expression式不能读取HTML文件

首先,我知道大多数RegExp问题。 这不是其中之一,“请写我的代码”的问题。

我的困惑在于,我的RegExp在regexr上工作,在chrome的开发工具中轮询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

正则expression式:

/@\{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 }); 

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> 

我是否错过了一些显而易见的东西,就像一个背后存在的人物,但不是曾经服过的东西?

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

ECMAscript 5.1规范指出:

一个字符可以直接处理,也可以表示一个范围。 如果它是ClassRanges的第一个或最后一个字符,范围指定的开始或结束限制,或者紧跟在范围指定之后,则按字面进行处理。

Regular-Expressions.info注意到:

在字符类的其他位置连字符,他们不能形成一个范围可能被解释为文字或错误。 正则expression式的味道是非常不一致的。

结论:

在字符类中包含减号的安全方式是:

  • 转义(例如[a-zA-Z0-9\->.]
  • 把它作为第一个字符。 在课堂上(例如[-.>a-zA-Z0-9]
    • 例外:在一个否定类中,它在^之后(例如[^-.>a-zA-Z0-9]
  • 放在课堂上最后(例如[a-zA-Z0-9.>-]

一般的编码准则build议首先放置你的范围,并用连字符结束字符类,这样可以避免模糊和帮助可读性。


总结起来,你的RegEx应该变成:

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

作为一个额外的提示

你也可以把[\s\S] (任何空格字符或任何非空白字符)改写成[^] (而不是任何东西)

这将结束你与以下正则expression式:

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

JavaScript …将[^]视为匹配任何单个字符的否定空字符类。 – 来源