JavaScript + RegEx并发症 - 搜索不包含SubString的字符串

时间:2013-08-12 21:50:51

标签: javascript regex

我正在尝试使用RegEx搜索一个长字符串,而我在编写表达式时遇到问题。我试图在一些HTML中搜索一组标签,这些标签以包含特定值的标签开头,并以包含其他值的不同标签结束。我目前用于尝试此操作的代码如下:

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

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

中间的陌生感(((\\?\\!endText).)*)来自另一个线程,找到了here,这似乎描述了我的问题。我面临的问题是表达式匹配起始标记,但它找不到结束标记,而是包含剩余的数据。此外,中间的环境减慢了很多表达。有关如何使其正常工作的任何建议吗?

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

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

1 个答案:

答案 0 :(得分:3)

首先,为什么一开始有.*点星号?如果您有以下文字:

This is my Text

你希望“我的文字”退出,你做my\sText。您不必执行.*

话虽如此,因为现在你所需要的就是你所需要的,你不需要围绕“Everything”的主要Capture Group。这个:.*(xxx)是一个巨大的禁忌,几乎总是可以替换为:xxx。换句话说,您的正则表达式可以替换为:

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

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

  1. 您正在寻找HTML开放式分隔符<。你消耗它。
  2. 您至少使用一个不是Closing HTML Delimeter的字符,但可以使用很多字符。这一点非常重要,因为如果您的代码为<table border=2>,那么您至少会消耗<t,如果不是更多的话。
  3. 您现在正在寻找StartText。如果该StartText为table,您将永远找不到它,因为您已使用t。因此,将+替换为*
  4. 如果以下内容不是结束文本,则正则表达式仍然成功,但是从文档的非常结束开始,因为Asterisk正在贪婪。我建议添加?
  5. 使其变得懒惰
  6. 当回溯失败时,它会查找结束文本并成功收集。
  7. 该逻辑的结果:

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

    如果你打算使用一个点,这对新的Regex作家来说没问题,但不建议经验丰富,我会选择这个:

    <[^>]*xxx.*?zzz
    

    因此,对于Javascript,您的代码会说:

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

    我把IgnoreCase“i”放在那里以获得良好的衡量标准,但你可能会或可能不会想要。