1

我正在尝试使用正则表达式来搜索一个长字符串,但我在想出一个表达式时遇到了麻烦。我正在尝试在一些 HTML 中搜索一组标签,这些标签以包含某个值的标签开始,并以包含另一个值的不同标签结束。我目前用来尝试的代码如下:

matcher = new RegExp(".*(<[^>]+" + startText + "((?!" + endText + ").)*" + endText + ")", 'g');

data.replace(matcher, "$1");

中间 ( ((\\?\\!endText).)*) 周围的陌生感是从另一个线程借来的,在这里找到,这似乎描述了我的问题。我面临的问题是表达式与开始标签匹配,但它没有找到结束标签,而是包含其余数据。此外,中间的环顾使表情放慢了很多。关于如何让这个工作的任何建议?

编辑: 我知道在 RegEx 中解析 HTML 不是最好的选择(让我觉得很脏),但我正处于时间紧迫的状态,我能想到的任何其他选择都需要太长时间。很难说我将要解析的标记到底是什么样子,因为我正在动态创建它。我能做的最好的事情就是说我正在查看一个大型数据表,该表是为一系列日期的一系列项目收集的。这两个范围都可以变化,我试图从单行中选择一定范围的日期。startText和的近似值endText\\@\\@ASSET_ID\\@\\@_<YYYY_MM_DD>. 这个想法是找到对应于这个单元格范围的代码。(此编辑很可能使这更加混乱,但我不确定在不解释整个应用程序的情况下我还能提供多少信息)。

编辑: 嗯,这是一个愚蠢的问题。显然,我只是忘了.*在最后一个括号之后添加。不敢相信我花了这么长时间!感谢那些试图提供帮助的人!

4

1 回答 1

3

首先,为什么.*开头有一个点星号?如果您有如下文本:

This is my Text

而你想要“我的文本”被拉出来,你做my\sText。你不必这样做.*

话虽如此,由于您现在要匹配的只是您需要的,因此您不需要围绕“Everything”的主要捕获组。this :.*(xxx)是一个巨大的禁忌,几乎总是可以用 this: 代替xxx。换句话说,您的正则表达式可以替换为:

<[^>]+xxx((?!zzz).)*zzz

从那里我检查它在做什么。

  1. 您正在寻找 HTML 开头的分隔符<。你消费它。
  2. 您至少使用一个不是关闭 HTML 分隔符的字符,但可以使用许多字符。这很重要,因为如果您的标签是<table border=2>,那么您至少已经消费了<t,如果不是更多的话。
  3. 您现在正在寻找 StartText。如果 StartText 是table,您将永远找不到它,因为您已经使用了t. 因此,将其替换+*.
  4. 如果以下不是结束文本,但从文档的 VERY END 开始,则正则表达式仍然成功,因为 Asterisk 是贪婪的。我建议通过添加一个?.
  5. 当回溯失败时,它会寻找结束文本并成功收集。

该逻辑的结果:

<[^>]*xxx((?!zzz).)*?zzz

如果你无论如何都要使用点,这对新的正则表达式作者来说是可以的,但不建议经验丰富的人使用,我会这样做:

<[^>]*xxx.*?zzz

所以对于 Javascript,你的代码会说:

matcher = new RegExp("<[^>]*" + startText + ".*?" + endText, 'gi');

我把 IgnoreCase "i" 放在那里是为了很好的衡量标准,但你可能想要也可能不想要。

于 2013-08-12T22:25:29.947 回答