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]);
现在如果我没有标签<xyz>1</xyz>
打印array1[0]
应该显示undefined
但它打印如下:
<abc name = "foo">
<child>bar</child>
</abc>
<abc name = "foo2">
<child>bar2</child>
</abc>
<xyz>
我认为\n*
存在一些问题,因为我给出了多行标志。不过不确定。
请注意,这是没有 <xyz>1</xyz>
标记的。我希望它打印未定义。
谢谢。
【问题讨论】:
你到底想在这里做什么?此外,正则表达式不一定是解析 html 的最佳工具。实际上,javascript 是一个 HTML 解析器,所以你最好用它来回答这个问题。 我将一个 xml 文件作为输入,我想将值存储在<xyz>
中,它可能出现在 <abc>
标记之后,也可能不出现。如果不存在,我想将该值存储为未定义
正如@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
这匹配<abc>
标记,后跟可选空格,然后紧跟<xyz>
标记。如果该标签为空,则在第一个捕获组match[1]
中不会捕获任何内容。
【讨论】:
试过这个。但是,如果标签为空,它将捕获下一个<xyz>
标签中的值
@starkVT 检查我更新的答案。为了让它工作,我需要添加另一个否定前瞻,以确保它不匹配来自不同 HTML 块的 <xyz>
标记。希望你能明白为什么正则表达式现在开始看起来不那么有吸引力了。
您非常慷慨地花时间尝试,但最好的答案是,正则表达式本质上是该工作的错误工具,而不是通过提供部分来强化 OP(和未来读者)的误解,脆性溶液。
@kjhughes 我要删除这个吗?我可以反驳您的评论,有时有人可能无法访问 XML 解析器。
我已经在重复链接列表中添加了 node.js 和浏览器 XML 解析解决方案。您已经在通过正则表达式解析 XML 的泥潭中走了两步。这是你的电话,但如果是我,我会停在这里。有时,当怪物层出不穷时,最好是说“远离沼泽”,而不是尝试解决该做什么。【参考方案2】:
正则表达式:
<\/abc>\n(?:<xyz>(.*)(?=<\/xyz))*
Regex Demo
js Demo
匹配 </abc>
后跟 <xyz>
和值。如果<xyz>
标签丢失array[0]
将返回一个空字符串(不是未定义)
【讨论】:
就像所有使用正则表达式处理 XML 的尝试一样,这当然是错误的。例如,它不允许空白出现在 XML 允许空白的地方。以上是关于js 正则表达式未按预期工作。未检测到换行符[重复]的主要内容,如果未能解决你的问题,请参考以下文章