regex NodeJS正则表达式在www.example.com()上返回0string.search

hl0ma9xz  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(84)

我正在编写一个NodeJS脚本(使用node命令从CMD启动),它以字符串的形式获取一些HTML内容,其中我需要提取特定<div>元素之间的一些数据。我很难理解为什么这部分代码没有给予我想要的输出。

const input = '<div class="some_class">Some data</div><div class="some_other_class">< class="some_other_other_class">...</div></div>'
const regex = new RegExp(/<div class="some_class"\>(.*?)<\/div>/g)
let obj = {
    'tmp': input.search(regex),
}
console.log(obj) // outputs { tmp: 0}
console.log(input.search(/<div class="some_class"\>(.*?)<\/div>/g)) // outputs 0
 
const x = input.search(/<div class="some_class"\>(.*?)<\/div>/g)
console.log(x) // outputs 0

我知道这似乎是一个经常性的问题,但我尝试过用字符串格式传递Regex(在单引号之间),将其作为Regex传递(在delimiter /之间),最后定义一个新的RegExp元素,但没有成功。我总是碰巧得到0作为输出。
然而,当我在在线工具上测试它时,它确实匹配并捕获了组#1中的所需数据:https://www.regextester.com/?fam=131034
我不知道我是错过了什么还是做错了什么,但是在这个问题上花了几个小时之后,我很难把我的想法弄清楚。

i7uq4tfw

i7uq4tfw1#

String::search()返回找到的字符串的位置,在您的情况下是0,这是完全正确的。您需要String::match(),并且不要忘记获取正确的regexp组索引:

const input = '<div class="some_class">Some data</div><div class="some_other_class">< class="some_other_other_class">...</div></div>'

console.log(input.match(/<div class="some_class">(.*?)<\/div>/)?.[1])

为了避免为我喜欢的组而烦恼,有时使用Assert:

const input = '<div class="some_class">Some data</div><div class="some_other_class">< class="some_other_other_class">...</div></div>'

console.log(...input.match(/(?<=<div class="some_class">).*?(?=<\/div>)/))

如果你的html经常变化,我推荐使用https://www.npmjs.com/package/jsdom来使用DOM访问你需要的标签中的内容。

相关问题