你應該總是標記語言的一些實現(「味道」)的正則表達式支持功能,其他人不。另請注意,我爲演示添加了一些條目。我需要另一個 - 沒有結果來正確顯示。
這兩個位置(<<
)似乎暗示服務器可以在不同位置具有相同的「名稱」。在這種情況下,這是不幸的(如果你沒有你可以動態生成的列表,我會稍微介紹一下)。
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