gpt4 book ai didi

javascript - RegExp 不适用于读取 HTML 文件

转载 作者:数据小太阳 更新时间:2023-10-29 05:18:45 26 4
gpt4 key购买 nike

首先,我知道大多数 RegExp 问题是怎么来的;这不是“请编写我的代码”问题之一。

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

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

为什么它在列出的两个地方都有效,但在 io.js 中却无效?我没有考虑到 io.js 读取文件的一些事情吗?

我的 RegExp 应该匹配“@{each ___->___} 文本和换行符@{/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
});

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 Specification指出:

A - character can be treated literally or it can denote a range. It is treated literally if it is the first or last character of ClassRanges, the beginning or end limit of a range specification, or immediately follows a range specification.

Regular-Expressions.info注意到:

Hyphens at other positions in character classes where they can't form a range may be interpreted as literals or as errors. Regex flavors are quite inconsistent about this.

结论:

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

  • 转义它(例如 [a-zA-Z0-9\->.])
  • 将其作为第一个字符。在类中(例如 [-.>a-zA-Z0-9])
    • 异常(exception):在否定类中,它排在第二位,紧跟在 ^ 之后(例如 [^-.>a-zA-Z0-9])
  • 将其放在类(class)最后(例如 [a-zA-Z0-9.>-])

一般编码准则建议将范围放在首位,并以连字符结束字符类,这可以避免歧义并有助于提高可读性。


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

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

作为额外提示:

您还可以将 [\s\S](任何空白字符。或任何非空白字符。)重写为 [^](不是什么都没有)

这将以以下 RegEx 结尾:

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

JavaScript ... treats [^] as a negated empty character class that matches any single character. - source

关于javascript - RegExp 不适用于读取 HTML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29197033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com