Javascript--Regex--以部分匹配结尾的多个单词的黑名单

Javascript--Regex--以部分匹配结尾的多个单词的黑名单,javascript,regex,blacklist,Javascript,Regex,Blacklist,我读过很多关于StackOverflow的问题,包括,甚至读过,这也是一个问题。我发现,它适用于整条线路,但不是“所有的坏词”。这些对我都没有帮助,所以我决定: 在Javascript中,我有一个很长的正则表达式模式。我试图在类似的句子结构中匹配一个序列,如下所示: UniquePrefixA[some token]和[some token]想要带[some token]去看猴子 UniqueC[some token]想将[some token]带到商店。UniqueB,[某些令牌]再次出现在模

我读过很多关于StackOverflow的问题,包括,甚至读过,这也是一个问题。我发现,它适用于整条线路,但不是“所有的坏词”。这些对我都没有帮助,所以我决定:

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

UniquePrefixA[some token]和[some token]想要带[some token]去看猴子

UniqueC[some token]想将[some token]带到商店。UniqueB,[某些令牌]再次出现在模式中

UniquePrefixA[some token]正在使用[some token]到[some token]

请注意,每个模式都以唯一的前缀开头。遇到该前缀表示模式的开始。如果我在捕捉过程中再次遇到这种模式,我不应该捕捉第二次出现,并就此停止。我会抓到所有的东西,直到那个前缀

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

我还使用了捕获组(不重复,因为捕获组只返回该组的最后一个匹配项)。捕获组内容需要返回,所以我使用match,non-greedy

这是我的模式和一个

我如何防止比赛继续通过黑名单?

我希望这一切发生在我画了三个箭头的地方,作为背景。任何字符的等价物,但不是此列表的内容:(UniquePrefixA | UniqueB | UniqueC)(如捕获组1所示)


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

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

  • 从您的任何唯一前缀开始查找每个文本块, 直到下一个或字符串的末尾

  • 处理每个这样的块,寻找你的一些代币,也许 还有他们之间的内容

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

    • (?:UniquePrefixA | UniqueB | UniqueC)
      -非捕获组 对于任何唯一前缀
    • (((?:.|\n)+?)
      -捕获组-用于进一步捕获的片段 处理(参见下面的注释)
    • (?=UniquePrefixA | UniqueB | UniqueC |$)
      -积极的前瞻性,前瞻性 对于任何唯一前缀或字符串的结尾(停止条件 您正在寻找)
    总之,整个正则表达式如下所示:

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

    • 除了
      \n
      )以外的任何字符
    • 或者只是
      \n
    这两种变体都被“封装”到一个非捕获组中, 设置变体的限制(两侧的
    ),因为重复 标记(
    +?
    )属于这两种变体

    +
    之后,表示版本

    所以这部分正则表达式(捕获组)将匹配任何字符序列 包括
    \n
    ,在下一个uniqie前缀(如果有)之前结束, 正如你所料

    第二个任务是将另一个正则表达式应用于捕获的块(组1), 正在查找
    [某些令牌]
    以及它们之间的内容。 您没有指定要对每个块执行的具体操作, 所以我不确定第二个正则表达式应该包括什么。
    也许只要匹配
    [某些标记]

    就足够了,以确保模式不会出现在重复的字符序列中,例如
    (\s|[^\[\]])*
    ,注意
    \s
    包含在
    [^\[\]
    中,因此可能只是
    [^\[\]*
    ,是为了预先准备一个负面的前瞻(这是一个零长度匹配断言,如重复模式左侧和内部的
    ^
    ),以便对每个字符进行检查:

    ((?!UniquePrefixA)(\s|[^\[\]]))*
    

    你能分享一下预期的输出吗?你能给我一个有多个选项的例子吗?我特别想找一些类似
    (?!UniquePrefixA | PrefixB | UniqueC)(\s |[^\[\]])的东西*
    。正如您在上面演示的那样,我已经看到了只使用一个单词的示例。另外,谢谢!另外,[^]中包含了
    \s*
    ,玩得很开心小组。谢谢!这绝对是一篇经过深思熟虑的帖子,可能会帮助我继续。我已经开始回复两三次,每一次都让我思考。考虑:(a…B…C,(GATE)然后也是D…E).ABC有一个特定的模式。但是,DE非常常见,当没有附加到DE时,会有许多错误匹配。但是您所说的是一种
    拆分('/(保留字)/')
    ,然后对每个块的整个模式执行模式匹配(不带停止字)?我不能100%确定这会起作用,(我正在仔细考虑我的停止词,以及我是否可以断章取义地对它们进行拆分)。也许我需要改进我的示例。是的,第一个正则表达式类似于拆分,但“普通”拆分需要删除第一个片段(在第一个唯一模式之前)。
    /(?:UniquePrefixA|UniqueB|UniqueC)((?:.|\n)+?)(?=UniquePrefixA|UniqueB|UniqueC|$)/gi
    
    ((?!UniquePrefixA)(\s|[^\[\]]))*