gpt4 book ai didi

Javascript -- 正则表达式 -- 以部分匹配结束的多个单词的黑名单

转载 作者:行者123 更新时间:2023-12-03 02:45:59 24 4
gpt4 key购买 nike

我在 StackOverflow 上阅读了很多问题,包括 this one , this one ,甚至阅读 Rexegg's Best Trick ,这也是一个问题 here 。我发现this one ,它适用于整行,但不适用于“坏词之前的所有内容”。这些都没有帮助我,所以我开始:

Javascript 中,我有一个很长的正则表达式模式。我试图匹配类似句子结构的序列,如下所示:

1 UniquePrefixA [some-token] and [some-token] want to take [some-token] to see some monkeys.

2 UniqueC [some-token] wants to take [some-token] to the store. UniqueB, [some-token] is in the pattern once more.

3 UniquePrefixA [some-token] is using [some-token] to [some-token].

请注意,每个模式都以唯一的前缀开头。遇到该前缀标志着模式的开始。 如果我在捕获过程中再次遇到该模式,我不应该捕获第二次出现,并停止。我将捕获该前缀之前的所有内容。

如果我在模式后面没有遇到前缀,我需要继续匹配该模式。

我还使用捕获组(不重复,因为捕获组仅返回该组的最后一个匹配项)。需要返回捕获组内容,因此我使用匹配,非贪婪。

这是我的模式和 working example

/(?:UniquePrefixA|UniqueB|UniqueC)\s*(\[some-token\])(?:and|\s)*(\[some-token\])?(\s|[^\[\]])*(\[some-token\])? --->(\s|[^\[\]])*<--- (\[some-token\])?(\s|[^\[\]])*/i

它基本上是按特定顺序排列的 2 个重复模式:

(\s|[^\[\]])*     // Basicaly .*, but excluding brackets
(\[some-token\]) // A token [some-token]

如何阻止匹配继续超过黑字列表?

为了上下文,我希望这种情况发生在我画了三个箭头的地方。相当于 Any 字符,但不是此列表的内容:(UniquePrefixA|UniqueB|UniqueC)(如捕获组 1 中所示)。

我可能需要更好地理解消极前瞻,或者它是否可以与一组事物一起工作。 最重要的是,我想知道消极的前瞻方法是否可以支持选项列表或者是否有更好的方法?如果答案是“你不能”这样做,”这也很酷。

最佳答案

我认为,一个更容易维护的解决方案是将您的任务分为两部分:

  1. 从任何唯一的前缀开始查找每个 block 文本,直到字符串的下一个或末尾。

  2. 处理每个这样的 block ,寻找你的一些 token ,也许还有它们之间的内容。

执行第一个任务的正则表达式应包括 3 部分:

  • (?:UniquePrefixA|UniqueB|UniqueC) - 非捕获组查找对于任何唯一的前缀。
  • ((?:.|\n)+?) - 捕获组 - 要进一步捕获的片段处理(见下面的注释)。
  • (?=UniquePrefixA|UniqueB|UniqueC|$) - 积极的前瞻,寻找对于任何唯一的前缀或字符串的结尾(停止标准您正在寻找)。

总而言之,整个正则表达式如下所示:

/(?:UniquePrefixA|UniqueB|UniqueC)((?:.|\n)+?)(?=UniquePrefixA|UniqueB|UniqueC|$)/gi

注意:不幸的是,正则表达式的 JavaScript 风格没有实现单行 (-s) 选项。因此,捕获组中不只是 .上面,你必须使用 (?:.|\n),意思是:

  • \n (.) 之外的任何字符,
  • 或只是\n

这两个变体都被“封装”到非捕获组中,限制变体(| 的两侧),因为重复标记(+?)适用于这两种变体。

注意+后面的?,表示不情愿版本。

因此正则表达式的这一部分(捕获组)将匹配任何字符序列包括 \n,在下一个 uniqie 前缀(如果有)之前结束,正如您所期望的那样。

第二个任务是将另一个正则表达式应用于捕获的 block (组 1),寻找[some-token]以及它们之间可能的内容。您没有指定您想要对每个 block 执行什么操作,所以我不确定第二个正则表达式应该包含什么。也许仅仅匹配 [some-token] 就足够了?

关于Javascript -- 正则表达式 -- 以部分匹配结束的多个单词的黑名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48089271/

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