我是一名初级程序员,试图在Processing sketch中解析HTML文件。 (顺便说一句,如果您不知道Processing,它将编译为Java并使用相同的正则表达式函数)。我使用SimpleML正确地将HTML文件捕获为单个String。我试图捕获的数据来自一个表,如下所示:
<th>Name</th>
<th>John F. Kennedy</th>
<th>Lyndon Johnson</th>
<th>Richard Nixon</th>
等
我想将候选人的名字解析成一个数组(删除“名字”)。
所以我第一次尝试
candidates = match(rawString,"<th>.*</th>");
返回了整个列表。
然后我试了
candidates = match(rawString,"<th>.{1,50}</th>");
仅返回
<th>Name</th>
处理文档说:
如果regexp中有组(由括号组指定),则每个组的内容将在数组中返回。正则表达式匹配的元素[0]返回整个匹配字符串,匹配组从元素[1]开始(第一组为[1],第二组为[2],依此类推)。
所以现在我一直在尝试各种组和量词组合,例如:
candidates = match(rawString,"(<th>.{1,50}</th>)*");
但是必须有一些我没有得到的概念性作品,因为没有任何效果。看起来这应该很容易,对吧?
答案 0 :(得分:1)
使用正则表达式解析HTML通常不是一个好主意,但你可能会在这里得到它。
你的问题似乎是.*
贪婪地匹配,我。即尽可能多的字符,从而匹配字符串中从第一个<th>
到最后</th>
的所有内容。
让它变得懒惰,我即告诉量词尽可能少匹配是一个解决方案:
<th>.*?</th>
可能会奏效。
更稳定,速度更快:告诉引擎确切的匹配内容,例如:
<th>[^<>]*</th>
[^<>]
表示“除了尖括号之外的任何字符”。
如果您尝试将嵌套结构与正则表达式匹配,则会遇到问题。它可以用现代的正则表达式来完成,但是做起来很难。添加HTML注释和字符串(可能包含您正在匹配的分隔符),并且您正处于一个受伤的世界。
答案 1 :(得分:1)
如果您希望多次匹配表达式,则可能需要matchAll
方法。 match
只希望您的模式匹配一次,因此只返回第一个找到的结果。