我有xml内容如下
<Artificial name="Artifical name">
<Machine>
<MachineEnvironment uri="environment" />
</Machine>
<Mobile>taken phone, test
when r1
100m SUV
then
FireFly is High
end
when r2
Order of the Phonenix
then
Magic is High
end
</Mobile>
</Artificial>
字符串
我想写一个函数,它接受一行(字符串)和内容(字符串),并返回所提供的行所属的最近标记的内容。
例如,如果我提供FireFly is High
行,它应该返回以下内容,因为它是所提供行所属的最近标记。
<Mobile>taken phone, test
when r1
100m SUV
then
FireFly is High
end
when r2
Order of the Phonenix
then
Magic is High
end
</Mobile>
型
以下是我的代码
getLineContent(line: string, content: string) {
const trimmedLine = line.trim()
const isSelfClosingTag = /\/\s*>$/.test(trimmedLine)
const isPlainTextLine = !/<|>/.test(trimmedLine)
const regex = new RegExp(`(${trimmedLine}[^>]*>)([\\s\\S]*?)</(${trimmedLine.split(' ')[0].substr(1)}>)`)
const isClosingTag = /^<\/\w+>$/.test(trimmedLine)
const match = content.match(regex)
if (!isClosingTag) {
if (isSelfClosingTag) {
return trimmedLine
}
if (match && match[2]) {
return match[1] + match[2] + match[3]
}
if (isPlainTextLine) {
const regex = new RegExp(`(<[^>]*>)([\\s\\S]*?${trimmedLine.split(' ')[0].substr(1)}[\\s\\S]*?</[a-zA-Z]+>)`)
const match = content.match(regex)
console.log('isPlainTextLine', match)
if (match && match[1] && match[2]) {
return match[2]
}
}
return trimmedLine
}
}
型
它几乎完美地工作,但并不完全。问题在于这部分代码
if (isPlainTextLine) {
const regex = new RegExp(`(<[^>]*>)([\\s\\S]*?${trimmedLine.split(' ')[0].substr(1)}[\\s\\S]*?</[a-zA-Z]+>)`)
const match = content.match(regex)
console.log('isPlainTextLine', match)
if (match && match[1] && match[2]) {
return match[2]
}
}
型
例如:如果我提供FireFly is High
,则返回值为
<Machine>
<MachineEnvironment uri="environment" />
</Machine>
<Mobile>taken phone, test
when r1
100m SUV
then
FireFly is High
end
when r2
Order of the Phonenix
then
Magic is High
end
</Mobile>
型
Regex不是我的强项。任何帮助都很感激。
1条答案
按热度按时间vnzz0bqm1#
正则表达式不是完成这项任务的合适工具。相反,使用XML解析器。有很多可供选择。例如,您可以使用fast-xml-parser。它将XML转换为嵌套的对象结构。演示:
字符串
作为第二个示例,在浏览器上下文中,您可以从WebAPI使用
DOMParser
:型