2017-03-07 102 views
-2

我需要帮助来从列表中过滤名称。正则表达式筛选列表中的匹配

正则表达式的代码,我到目前为止它得到了我一切

(.*(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

为什么哟匹配SIN-SCARCP03,但筛选出SIN-SCARCP04?你的标准是什么? – DyZ

+0

这些是服务器名称,我需要两台服务器,因为它们是测试服务器。 我的实际名单是300名更大。我只需要筛选出一对夫妇 – user3839452

+0

除非您告诉我们什么是标准,否则我们无法帮助您处理您的正则表达式。 – DyZ

回答

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

而这最终字符串转换为你使用任何语言的实际regex对象。