Javascript RegExp无法读取HTML文件

Javascript RegExp无法读取HTML文件,javascript,regex,node.js,Javascript,Regex,Node.js,首先,我知道大多数RegExp问题是如何进行的;这不是一个“请写我的代码”的问题 我的困惑在于,我的RegExp在regexr上工作,在chrome的开发工具中轮询document.body.textContent,但在我在io.js中阅读了HTML文件之后,它就不在HTML文件上工作了 io.js是1.5.1版,在windows 8上运行 为什么它在列出的两个地方都能工作,但在io.js中却不行?我没有考虑io.js在读取文件时所做的事情吗 我的RegExp应该像在下面的链接中一样匹配“{ea

首先,我知道大多数RegExp问题是如何进行的;这不是一个“请写我的代码”的问题

我的困惑在于,我的
RegExp
在regexr上工作,在chrome的开发工具中轮询
document.body.textContent
,但在我在io.js中阅读了HTML文件之后,它就不在HTML文件上工作了

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

为什么它在列出的两个地方都能工作,但在io.js中却不行?我没有考虑io.js在读取文件时所做的事情吗

我的
RegExp
应该像在下面的链接中一样匹配“
{each___>}文本和换行符{/each}
”,但它返回
null

以下是我试图使用的:

RegExp:

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

JS(示例):

HTML:


@{title}
@{foo.bar}

Lorem ipsum dolor sit amet,{foo.baz.hoo}

@{每个人->个人} @{person.name}:@{person.age} @{/每个}

我是否遗漏了一些明显的东西,比如一个出现在背面但一次也没有送达的角色?

这里的问题在于规范实现之间的细微差别

声明:

-
字符可以按字面意思处理,也可以表示范围。如果它是类范围的第一个或最后一个字符,范围规范的开始或结束限制,或者紧跟范围规范,则按字面处理

注意到:

字符类中无法形成范围的其他位置的连字符可能被解释为文字或错误。关于这一点,正则表达式的风格非常不一致

结论: 在字符类中包含破折号
-
减号的安全方法是:

  • 逃逸(例如
    [a-zA-Z0-9\->.]
  • 将其作为第一个字符。在课堂上(例如
    [-.>a-zA-Z0-9]
    • 例外:在否定类中,它排在第二位,紧跟在
      ^
      之后(例如
      [^-.>a-zA-Z0-9]
  • 将其放在班上的最后(例如
    [a-zA-Z0-9.>-]
一般编码准则建议将范围放在第一位,并用连字符结束字符类,这样可以避免歧义,并有助于可读性


总之,您的正则表达式应该是:

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

作为附加提示:

您还可以将
[\s\s]
(任何空格字符或任何非空格字符)重写为
[^]
(不是空的)

这将使用以下正则表达式结束您:

/@\{each ([a-zA-Z0-9>.-]*)\}([^]*)@\{\/each}/g
JavaScript。。。将
[^]
视为匹配任何单个字符的否定空字符类。-


我也在工作。奇怪。如果你只是
console.log(html)
你看到了什么意想不到的事情吗?@PeterBowers没有,它看起来和我粘贴在这里的那块html一模一样。如果你去掉
编码:utf8
选项(我在抓稻草…@apgp88,就在昨天,当我终于厌倦了看到其他人那样发布他们的regex时,我的头撞到了那上面。只要点击“保存”按钮,它就会给你链接。或者第一个:)很好地找到了!如果为false,连字符可以位于范围或速记字符类之后,而不必转义:
[a-z-2]
允许与
[\w-2]
类似<代码>[^]是一种旧语法,并非所有javascript实现都支持它。它似乎是破折号和我的“any char”选择的组合。Thanks@CasimiretHippolyte:您确定这是旧语法吗?撇开兼容性不谈(对于不同的浏览器,兼容性可能会有所不同),它是在ECMAScript 5和ECMAScript 6中明确定义的。关于
[^]
,JS RegEx支持它(参考到:)。不过,我对它正在逐步淘汰的口味很感兴趣,请回复此评论帖子。
/@\{each ([a-zA-Z0-9>.-]*)\}([\s\S]*)@\{\/each}/g
/@\{each ([a-zA-Z0-9>.-]*)\}([^]*)@\{\/each}/g