Bash

不適用於帶有連字元的域的正則表達式

  • December 3, 2016

我有一些智能腳本,可以檢查伺服器名稱並獲取域名。例如,我有伺服器名稱:example.ru01。我需要得到:example.ru 我的 scipt:

#!/bin/bash

hostname=example.com01
echo $hostname
reg0="\(\(\w*\.[a-z]*\)\|\(\w*\.[a-z]*\.[a-z]*\)\)"
domain=`expr match $hostname $reg0`
echo $domain

沒關係。在輸出中我有:

example.com01
example.com

但是,在我的基礎架構中,我有一些帶有連字元的域。例如:test-test.com01。但它在我的腳本中不起作用。如何解決這個問題?請幫忙。我對正則表達式進行了一些更改,如下所示:

\(\(\w*\.[a-z_-]*\)\|\(\w*\.[a-z_-]*\.[a-z_-]*\)\)

但它不起作用。我哪裡有錯誤?請幫忙。感謝您的關注。

您的正則表達式的問題在於您告訴它,它必須首先將您的字元串與零到無窮大的數量相匹配,\w其中“匹配任何單詞字元,包括下劃線”,然後是文字點.。( \w*\.)

如果test-test.com01由於連字元而不匹配,因此如果您將其更改為匹配,-那麼它將按照您希望的方式工作:

\(\([a-z_-]*\.[a-z_-]*\)\|\([a-z_]*\.[a-z_-]*\.[a-z_-]*\)\)
     ^ replace \w            ^ replace \w

有幾種方法可以改進這個正則表達式,但 IMO 你應該花多少時間來製作一個好的正則表達式與你解析的文本的複雜性成正比。

引用自:https://serverfault.com/questions/818574