js 正则表达式未按预期工作。未检测到换行符[重复]

Posted

技术标签:

【中文标题】js 正则表达式未按预期工作。未检测到换行符[重复]【英文标题】:js Regex not working as expected. Newline not getting detected [duplicate] 【发布时间】:2018-10-07 19:42:43 【问题描述】:

我有一个字符串如下:

<abc name = "foo">
  <child>bar</child>
</abc>
<xyz>1</xyz>

<abc name = "foo2">
  <child>bar2</child>
</abc>
<xyz>5</xyz>

我创建了一个正则表达式如下:

var regexapi = /<abc\s*name\s*=\s*"(.*?)"[\s\S]*?<\/abc>\n*<xyz>/gim;
while ( (resApi = regexapi.exec(data))) 
    array1.push(resApi[0]);

console.log(array1[0]);

现在如果我没有标签&lt;xyz&gt;1&lt;/xyz&gt;打印array1[0]应该显示undefined但它打印如下:

    <abc name = "foo">
  <child>bar</child>
</abc>

<abc name = "foo2">
  <child>bar2</child>
</abc>
<xyz>

我认为\n* 存在一些问题,因为我给出了多行标志。不过不确定。 请注意,这是没有 &lt;xyz&gt;1&lt;/xyz&gt; 标记的。我希望它打印未定义。 谢谢。

【问题讨论】:

你到底想在这里做什么?此外,正则表达式不一定是解析 html 的最佳工具。实际上,javascript 是一个 HTML 解析器,所以你最好用它来回答这个问题。 我将一个 xml 文件作为输入,我想将值存储在 &lt;xyz&gt; 中,它可能出现在 &lt;abc&gt; 标记之后,也可能不出现。如果不存在,我想将该值存储为未定义 正如@TimBiegeleisen 所说,使用诸如github.com/Leonidas-from-XIV/node-xml2js 这样的XML 解析器会比正则表达式更容易。 您也可以使用 Cheerio (github.com/cheeriojs/cheerio) 并以类似\jQuery 的方式查询您的数据。 不要使用正则表达式解析 XML;使用真正的 XML 解析器。 请参阅重复链接(以及此处和网络上的许多其他帖子)以获取解释。 【参考方案1】:

您最好在这里使用 XML 解析器。如果您坚持使用正则表达式,这里有一种选择:

var input = "<abc name = \"foo\">\n\t<child>bar</child>\n</abc>\n<xyz>\n\n<abc name = \"foo2\">\t\n<child>bar2</child>\n</abc>\n<xyz>35</xyz>";
var regex = /<abc[^>]*>(?:(?!<\/abc>)[\s\S]*)<\/abc>\s*<xyz>((?!<xyz>)[\s\S]*)<\/xyz>/g;
var match = regex.exec(input);
console.log(match[1]); // 35

这匹配&lt;abc&gt; 标记,后跟可选空格,然后紧跟&lt;xyz&gt; 标记。如果该标签为空,则在第一个捕获组match[1] 中不会捕获任何内容。

【讨论】:

试过这个。但是,如果标签为空,它将捕获下一个 &lt;xyz&gt; 标签中的值 @starkVT 检查我更新的答案。为了让它工作,我需要添加另一个否定前瞻,以确保它不匹配来自不同 HTML 块的 &lt;xyz&gt; 标记。希望你能明白为什么正则表达式现在开始看起来不那么有吸引力了。 您非常慷慨地花时间尝试,但最好的答案是,正则表达式本质上是该工作的错误工具,而不是通过提供部分来强化 OP(和未来读者)的误解,脆性溶液。 @kjhughes 我要删除这个吗?我可以反驳您的评论,有时有人可能无法访问 XML 解析器。 我已经在重复链接列表中添加了 node.js 和浏览器 XML 解析解决方案。您已经在通过正则表达式解析 XML 的泥潭中走了两步。这是你的电话,但如果是我,我会停在这里。有时,当怪物层出不穷时,最好是说“远离沼泽”,而不是尝试解决该做什么。【参考方案2】:

正则表达式:

<\/abc>\n(?:<xyz>(.*)(?=<\/xyz))*

Regex Demo

js Demo

匹配 &lt;/abc&gt; 后跟 &lt;xyz&gt; 和值。如果&lt;xyz&gt; 标签丢失array[0] 将返回一个空字符串(不是未定义)

【讨论】:

就像所有使用正则表达式处理 XML 的尝试一样,这当然是错误的。例如,它不允许空白出现在 XML 允许空白的地方。

以上是关于js 正则表达式未按预期工作。未检测到换行符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

NSpredicate 上的正则表达式未按预期工作

LDAP olcAccess 正则表达式未按预期工作

使用正则表达式查找命令未按预期工作

Grep 正则表达式未按预期工作

NLTK - nltk.tokenize.RegexpTokenizer - 正则表达式未按预期工作

正则表达式未按预期进行评估