2013-08-30 261 views

回答

6

這會幫助你理解

Regular expression visualization

對此明確:(\S.*?)

  • (開始您的捕獲組(第1組)
  • \S非空格字符
  • .是任何角色; *?是「零次或多次」(非貪婪)
  • )結束您的捕獲組

在簡單的英語,你的整個正則表達式說

  • 從字符串的開頭
  • 匹配零個或多個空格
  • 開始捕獲組
    • 尋找一個非空白
    • 後跟任意字符零次或多次
  • 結束捕獲組
  • 匹配的零個或多個空白
  • 則字符串的結尾

一種奇怪的正則表達式,恕我直言。

+0

+1你從哪裏得到的圖/ – Bohemian

+0

檢查圖片來源:) – naomik

+4

+1讓我們知道這個網站http://www.debuggex.com/。幫助學習正則表達式。謝謝。 – Sid

5

的代碼:

$key =~ /^\s*(\S.*?)\s*$/o 

將在$1其中產生一個字符串所有前導和尾部空格(由\s所定義的)被去除

意圖的代碼似乎在檢查該字符串不僅僅包含空格,並且同時獲得一個修剪過的字符串。但是,只有假設正確,該字符串不包含多行,正則表達式將無法匹配。例如,"  somestring\nsomestring   \nmore string"

作爲總結,該情況下,測試不合格是:

僅由空格(由 \s定義)
  • 字符串
  • 空字符串。
  • 與正則表達式匹配的字符串(非錨定)/\S.*\n.*\S/s

是Perl相當於[\n].?當s修飾符無效時,它是否排除其他任何內容?


至於在年底o改性劑,它似乎是an obsolete modifier in the later versions of Perl。該修飾符可防止舊版本的Perl不必要地重新編譯該模式,但當前的用法限於幾種使用情況。檢查perlop文檔(搜索/o)以獲取更多信息。

+1

你說它刪除了前導空白和尾隨空白。更確切地說,它將修剪後的字符串存儲在特殊變量「$ 1」中。順便提一下,你可以縮短一點:'\ S'也可能是'.',因爲如果那個位置的字符是'\ s',它就會匹配作爲初始'\ s *'的一部分。而'.. *?'相當於'。+?'。所以你可以把'(\ S。*?)'改成'(。+?)'。或者,你可以做一些像'/(\ S。* \ S)/'(如果你知道至少有2個非空白字符)。 –

+1

@DavidKnipe:不,如果刪除\ S,即使只有空格字符,也會進行正則表達式匹配。 – ysth

+0

這是真的我想。儘管這並不重要,但假設OP期望在字符串中獲得一些非空白字符。 –

1

除了這個正則表達式的嚴格意義上,(由@naomik有據可查),整個指令:

if ($key =~ /^\s*(\S.*?)\s*$/o) 

表示:

如果$key正則表達式匹配,集團$1將包含與$key相同,沒有前導和尾隨空格。
\o修飾符(現已過時),避免重新編譯正則表達式。您應該使用qr/^\s*(\S.*?)\s*$/代替:

my $re = qr/^\s*(\S.*?)\s*$/; 
if ($key =~ $re) 
+0

'/ o'修飾符已過時,因爲perl會緩存編譯後的正則表達式(如果它沒有動態變化)(即,如果沒有插入變量)。因此,這裏不需要'/ o'和'qr //'。 – amon

相關問題