正则表达式过滤掉列表中的匹配项

时间:2017-03-07 03:31:06

标签: regex

我需要帮助来过滤掉列表中的名称。

到目前为止,

正则表达式代码可以解决所有问题

(.*(SCARCP|SCDIRP).*)

示例我需要如何过滤的列表:

SGP-SCARCP03 - MATCH
SIN-SCARCP03 - MATCH
SIN-SCARCP04 - FILTER OUT 
SIN-SCARCP06 - MATCH
SYD-SCARCP01 - MATCH
SYD-SCARCP02 - FILTER OUT 
TOK-SCARCP02 - MATCH
SIN-SCDIRP01 - MATCH

1 个答案:

答案 0 :(得分:0)

您应始终将语言标记为正则表达式支持功能的某些实现(“风格”),而其他人则不会。另请注意,我为演示添加了一些条目。我需要另一个 - 没有结果来正确演示。

这两个位置(<<)似乎暗示服务器在不同位置可以具有相同的“名称”。在这种情况下这是不幸的(如果你没有列表,你可以动态生成,我稍后会介绍)。

SGP-SCARCP03 - MATCH
SIN-SCARCP03 - MATCH
SIN-SCARCP04 - FILTER OUT 
SIN-SCARCP06 - MATCH
SYD-SCARCP01 - MATCH
SYD-SCARCP02 - FILTER OUT  <<
TOK-SCARCP02 - MATCH       <<
SIN-SCDIRP01 - MATCH

如果您需要手动输入,这是您的正则表达式。请注意,-1是我认为永远不会匹配的占位符。这样您就可以看到需要输入|分隔列表的位置,就像使用SYD-SCARCP(?!(?:02|99)\b)

一样

^.*(SYD-SCARCP(?!(?:02|99)\b)|SGP-SCARCP(?!(?:-1)\b)|TOK-SCARCP(?!(?:-1)\b)|SIN-SCARCP(?!(?:04)\b)|SCDIRP(?!(?:02)\b)).*$demo,请注意多行标志是打开的,以及freespacing标志,但仅当您使用间隔开的正则表达式时才会这样做。)

^
.*?
(
  SYD-SCARCP
  (?!
    (?:02|99)
    \b
  )
|
  SGP-SCARCP
  (?!
    (?:-1)
    \b
  )
|
  TOK-SCARCP
  (?!
    (?:-1)
    \b
  )
|
  SIN-SCARCP
  (?!
    (?:04)
    \b
  )
|
  SCDIRP
  (?!
    (?:02)
    \b
  )
)
.*$

如果您在同一行上有两个服务器名称,则此特定设计可能无效,但速度比替代方案快。

现在,虽然很乱,但可能会有一些好消息。如果你有一个列表,一些标记开发服务器或实时服务器的数据库标志,就像你可以构建一个生产服务器名称数组(它更容易匹配而不是排除。

比方说我们构建的数组是

lives = {"SGP-SCARCP03","SIN-SCARCP03","SIN-SCARCP06","SYD-SCARCP01","TOK-SCARCP02","SIN-SCDIRP01"}

我可能会建议按字母顺序对字符串进行反向排序。像lives.sort().reverse()这样的东西。如果两个字符串“重叠”说“ SGP-SCARCP03 ”和“ SGP-SCARCP03 0”和“ SGP-SCARCP03”,则反转可以帮助交替获取相应的字符串 1"

您可以使用您的语言可能支持的任何array.join/concat方法

livelist = strings.join(lives,"|")

并将正则表达式构建为字符串

REFilter = "^.*?\b(?:" & liveslist & ")\b.*$"

\b表示RegEx的大多数版本中的单词边界。

在我们的案例中,这将成为

.*?\b(?:SGP-SCARCP03|SIN-SCARCP03|SIN-SCARCP06|SYD-SCARCP01|TOK-SCARCP02|SIN-SCDIRP01)\b.*$

我还建议在将数组转换为管道分隔列表之前,按字母顺序对数组进行排序。

我建议之前按字母顺序对列表进行排序。然后,您可以通过一些代码向导将正则表达式字符串向下调整,使其看起来更像

(?:TOK-(?:SCARCP(?:02))|SYD-(?:SCARCP(?:01|07))|SIN-(?:SCARCP(?:06|03)|SCDIRP(?:01))|SGP-(?:SCARCP(?:03)))

执行此操作的原因是回溯以查找匹配项,但在许多情况下使用简单表达式时,差异可能不明显。

然后

^.*?(?:TOK-(?:SCARCP(?:02))|SYD-(?:SCARCP(?:01|07))|SIN-(?:SCARCP(?:06|03)|SCDIRP(?:01))|SGP-(?:SCARCP(?:03))).*$ demo

将最终字符串转换为您正在使用的任何语言的实际正则表达式对象。