-4

HTML 代码之间:

...<div class="..."><a class="..." href="...">I need this String only</a></div>...

如何编写正则表达式(对于使用 Perl RegEx 的 Rainmeter),以便:

- 需要的字符串"I need this String only"被分组以被提取,

- HTML 链接标签<a>...</a>可能 不存在或存在,并且可以存在于所需字符串之间,也可以存在多次。

我的尝试:

(?siU)<div class="...">.*[>]{0,1}(.*)[</a>]{0,1}</div> 其中:

.*= captures every characters except newline{<a class ... "}
[>]{0,1}= accepts 0 or 1 times presence of > {upto >}
(.*)= captures my String
[</a>]{0,1}= accepts 0 or 1 times presence of </a> 

当然,这不能按我的意愿工作, 这会在我的字符串之前提供带有 HTML 链接的输出, 所以我的问题是

如何编写更好的(和有效的)正则表达式?

4

1 回答 1

-1

即使我同意使用真正的解析器来解决这个问题的建议,这个正则表达式应该可以解决你的问题:

<div [^.<>]|*>(?:[^<>]*<a [^<>]*>)*([^<>]*)(?:</a>)*</div>

逻辑:

  • <div ...>在开头和</div>结尾都需要。
  • 在匹配的文本之前允许和忽略<a ...>任意多次
  • </a>任意多次匹配文本后允许和忽略
  • 忽略任何前面的任何<a ...>文字[^<>]*。Using.*也可以,但是它会任意跳过所有文本,直到字符串中的最后一个实例。<a ...>
  • 我使用[^<>]*而不.*是以受保护的方式匹配非标记文本,因为字面量<>不允许。
  • 我习惯于(?:...)分组而不捕获。如果您的编程语言不支持,请(...)改用,并调整您使用的匹配项。

警告:这不是完全通用的,但应该可以解决您所描述的问题。

于 2020-07-07T15:17:07.543 回答