你应该总是标记语言的一些实现(“味道”)的正则表达式支持功能,其他人不。另请注意,我为演示添加了一些条目。我需要另一个 - 没有结果来正确显示。
这两个位置(<<
)似乎暗示服务器可以在不同位置具有相同的“名称”。在这种情况下,这是不幸的(如果你没有你可以动态生成的列表,我会稍微介绍一下)。
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对象。
为什么哟匹配SIN-SCARCP03,但筛选出SIN-SCARCP04?你的标准是什么? – DyZ
这些是服务器名称,我需要两台服务器,因为它们是测试服务器。 我的实际名单是300名更大。我只需要筛选出一对夫妇 – user3839452
除非您告诉我们什么是标准,否则我们无法帮助您处理您的正则表达式。 – DyZ