2010-03-05 62 views
3

我必須使用殘缺的工具,它不提供任何方法來修剪從字符串中引出尾隨空格。它確實有.NET風格的正則表達式,但只實現了Match,而不是替換。所以,我這個正則表達式,似乎工作上來(令人驚訝由我自己)..但我沒有完全理解爲什麼它的工作原理 :-)使用reqex匹配的修剪字符串

$trimmed = regex/[^ ].*[^ ]/ ($original_string) 

爲什麼這個工作,真的能行在所有情況下,是有(即使小組賽不能捕捉:()一個更好的辦法,如果你只有正則表達式匹配?

+0

如果正則表達式不匹配,那麼'regex //'函數會返回什麼?一個空字符串?整個原始字符串? – 2010-03-05 12:49:43

回答

3

應該很好地工作,除非有隻有一個字符的空間包圍。

您的模式搜索:

  1. 甲非空格字符任何種[^ ]
  2. 零個或多個字符,儘可能多的(貪婪匹配).*
  3. 甲非空格字符[^ ]

所以,如果有AREN至少有兩個非空格字符(1和3),模式根本不匹配。

您應該使用\b代替[^ ],將匹配任何「字邊界」,但將長度爲零,也不會要求兩個非空格字符:

\b.*\b 
+2

如果第一個或最後一個非空格字符是標點符號,該怎麼辦?例如,應用於'#foo#'的'\ b。* \ b'將返回'foo',這是不對的。 – 2010-03-05 12:46:21

+0

好的一點,人們可以使用的是自定義的前瞻和lookbehead來捕捉空白或字符串的開始/結束。 – Timo 2010-03-06 07:01:02

2

它的工作原理是這樣的: [^ ]將匹配第一個非空格字符,.*將匹配任何內容,而[^ ]將再次匹配非空格字符。由於正則表達式是貪婪的,所以返回最長的匹配,所以在這種情況下,最長的可能的字符串在兩端有兩個非空格,在$original_string的開始和結尾有效地刪除空格。

關於正則表達式的一個很好的教程是here,它教你關於貪婪和懶惰匹配,這是理解和優化正則表達式的關鍵。它還教你如何匹配字符,這就是你想在這裏做的事情(參見馬丁的答案)。