正则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 …将
[^]
视为匹配任何单个字符的否定空字符类。 – 来源