2016-07-29 148 views
1

正則表達式的目的是獲取一個字符串,並列出所有主機名,但只從右側取3個點。正則表達式匹配3個點的域

它的工作原理,但它可能會看到腳本選擇左側的主機名,而不是右側。

正則表達式

((([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){1,3}[a-zA-Z]{2,63}) 

現在

site.com1.site.com2.1.site.com3.2.1.site .COM 4.3.2.1 .site.com 5.4.3.2 .1.site.com

固定

site.com1.site.com2.1.site.com 3. 2.1.site.com 4.3。 2.1.site.com 5.4.3。 2.1.site.com

+0

可以更換'[A-ZA-Z0-9]''與[\瓦特]',或者更嚴格的'[:alnum:]' –

+0

因爲我知道\ w已經強調了,所以我認爲:alnum:等於「a-zA-Z0-9」更好。 – JavaOdd

+0

是的,這就是爲什麼我說如果你需要「更嚴格」的條件使用':alnum:',否則在URL中你很少會找到一個'_'。 '\ w'只是簡短的。順便說一句,你爲什麼要刪除所有的換行符?這很難讀 –

回答

1

如果您想使用您正則表達式的,你需要與剛剛{0,3}出現限制+,並在最後用一個\b字邊界(?!\.)前瞻,以確保我們的字符串匹配在後字邊界,有不應該是後一個點:

(([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){0,3}[a-zA-Z]{2,63}\b(?!\.) 
                   ^^^^^    ^^^^^^^^ 

regex demo

注意+量詞1次或多次出現孔定量相匹配fied子模式和{0,3}限制(限定)量詞允許將o僅匹配到3次。

在C++中,你可以使用一個原始字符串文字(R"(<PATTERN>)")來定義正則表達式,以避免overescaping:

std::regex rx(R"((([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){0,3}[a-zA-Z]{2,63}\b(?!\.))"); 
+0

它的工作原理,但如果該行有兩個主機名,它只是匹配正確的。 – JavaOdd

+0

但這就是您的示例輸入建議。那麼什麼要求?請在問題中添加相關的測試用例。 –

+0

是的,示例輸入表明,但它有必要使用整個文本(或字符串),而不是每行。 – JavaOdd