2017-03-07 96 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對象。