gpt4 book ai didi

JavaScript + RegEx 复杂化——搜索不包含子字符串的字符串

转载 作者:行者123 更新时间:2023-11-30 12:58:32 27 4
gpt4 key购买 nike

我正在尝试使用 RegEx 来搜索一个长字符串,但我在想出一个表达式时遇到了问题。我正在尝试通过一些 HTML 搜索一组标签,这些标签以包含特定值的标签开始,以包含另一个值的不同标签结束。我目前用于尝试此操作的代码如下:

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

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

中间的奇怪之处(((\\?\\!endText).)*)是从另一个线程借来的,发现here ,这似乎描述了我的问题。我面临的问题是表达式匹配开始标记,但它没有找到结束标记,而是包含数据的其余部分。此外,中间的环视使表情放慢了很多。关于如何使它正常工作有什么建议吗?

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

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

最佳答案

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

This is my Text

如果你想把“我的文本”拉出来,你就可以my\sText .您不必执行 .* .

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

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

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

  1. 您正在寻找一个 HTML 开头的 Delimeter < .你消费它。
  2. 您至少使用了一个不是结束 HTML 定界符的字符,但可以使用多个。这很重要,因为如果您的标签是 <table border=2> ,那么到目前为止你至少消耗了 <t ,如果不是更多的话。
  3. 您现在正在寻找 StartText。如果 StartText 是 table ,你永远找不到它,因为你已经消耗了 t .所以替换那个 +* .
  4. 如果以下不是结束文本,但正则表达式仍然成功,而是从文档的尾部开始,因为星号是贪婪的。我建议通过添加 ? 使其变得懒惰.
  5. 当回溯失败时,会寻找结束文本并成功收集。

该逻辑的结果:

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

如果您无论如何都要使用点,这对新的正则表达式编写者来说没问题,但不建议经验丰富的人使用,我会这样做:

<[^>]*xxx.*?zzz

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

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

我把 IgnoreCase“i”放在那里是为了更好的测量,但你可能想要也可能不想要它。

关于JavaScript + RegEx 复杂化——搜索不包含子字符串的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18197255/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com