regex 捕获标记之间的所有内容< pre>< /pre>

jchrr9hc  于 2023-04-13  发布在  其他
关注(0)|答案(4)|浏览(162)

我正在阅读一个.html文件:

const htmlin = String(fs.readFileSync(inputHtml) || '');

const splitted = htmlin.split(/<pre.*>/);
splitted.shift();

const justPost = splitted.join('').split('</pre>');
justPost.pop();

但我在寻找一种方法来匹配

aaa <pre> xxx </pre> bbb <pre> foo </pre> ccc

并匹配外部的文本。这样我就可以得到两个数组:

['aaa ', ' bbb ', ' ccc']

[' xxx ', ' foo ']

我如何用正则表达式或其他方法来实现这一点?

os8fio9y

os8fio9y1#

一种方法是使用正则表达式替换函数和捕获组。

<pre>(.*?)(?=<\/pre>)|(?:^|<\/pre>)(.*?)(?=$|<pre>)
  • <pre>(.*?)(?=<\/pre>)-匹配pre标记之间的文本。(g1)
  • (?:^|<\/pre>)(.*?)(?=$|<pre>)-匹配pre标记外的文本。(g2)
let str = `aaa <pre> xxx </pre> bbb <pre> foo </pre> ccc`
let inner = []
let outer = []

let op = str.replace(/<pre>(.*?)(?=<\/pre>)|(?:^|<\/pre>)(.*?)(?=$|<pre>)/g, function (match,g1,g2){
  if(g1){
    inner.push(g1.trim())
  } 
  if(g2){
    outer.push(g2.trim())
  }
  return match
})

console.log(outer)
console.log(inner)
dgsult0t

dgsult0t2#

您可以使用dom或domparser来代替正则表达式。
例如,创建一个div并将innerHTML属性设置为html。然后循环子节点并获取innerHTML或textContent。
例如:

let htmlString = `aaa <pre> xxx </pre> bbb <pre> foo </pre> ccc`,
  pre = [],
  text = [];
let div = document.createElement('div');
div.innerHTML = htmlString;

div.childNodes.forEach(x => {
  if (x.nodeType === Node.TEXT_NODE) {
    text.push(x.textContent.trim())
  }
  if (x.nodeName === "PRE") {
    pre.push(x.innerHTML.trim());
  }
});

console.log(pre);
console.log(text);
vdgimpew

vdgimpew3#

我使用re.dotall来查找

and

然后在回车时拆分

txt="""111 abc<pre>seven
eight
nine
ten
eleven
twelve</pre>
<pre> one 
two 
three 
four 
five 
six </pre>def"""
results= re.findall(r'<pre>(.*?)</pre>', txt,re.DOTALL)
print(results)
word_list=[]
for item in results:
    print(item)
    words=item.split("\n")
    for word in words:
        word_list.append(word)
        
print(word_list)
jdg4fx2g

jdg4fx2g4#

因为你可能有html标签在里面-我个人会把一个标记,不存在于html在结束标签€这样.然后我会搜索从开始的前标签

const myTextWithMarker = myText.replace('</pre>', '¬</pre>');
const regResult = myTextWithMarker.match(/<pre( [^>]*)?>([^¬]*)/);
const myContent = regResult[0]

相关问题