2017-08-13 233 views
1

我試圖找到匹配任何字符串的正則表達式!一些搜索後,我發現幾乎所有的答案說,[\s\S]將匹配任何字符串作爲表示here.*如說here空的正則表達式匹配任何字符串

不過,雖然打了一下,用PHP preg_match我發現一個空的正則表達式是匹配任何字符串!

if(preg_match("//u", "")) echo "empty string matchs\n"; 
else echo "empty string does not match\n"; 

if(preg_match("//u", "abc")) echo "abc matchs\n"; 
else echo "abc does not match\n"; 

if(preg_match("//u", "\n")) echo "new line matchs\n"; 
else echo "new line does not match\n"; 

if(preg_match("//u", "/")) echo "/ matchs\n"; 
else echo "/ does not match\n"; 

exit; 

這將輸出

empty string matchs 
abc matchs 
new line matchs 
/matchs 

現場演示(https://eval.in/845001

我可以用這個空正則表達式安全搭配什麼嗎?什麼是空的正則表達式?

如果你問我爲什麼會需要一個匹配任何一個正則表達式,這是因爲我使用的是需要一個正則表達式的參數作爲它的字符串驗證功能部位的功能,我想它接受什麼。

+0

匹配沒有字符串的正則表達式是沒有正則表達式。只要執行'if($ string ==「」)或'if(strlen($ string)== 0)' – Ibu

+0

@Ibu謝謝。但是我必須通過任何正則表達式來驗證字符串的函數。 –

+0

您的第一個條件應該是檢查字符串是否爲空,然後進入正則表達式 – Ibu

回答

2

一個空的正則表達式模式//匹配字符串中字符之間的開始,結束和任何位置。看到這個演示在eval.in preg_match_all('//', "foo", $out);返回4個空場比賽:

Array[0] => [1] => [2] => [3] =>)

由於preg_match只會檢查它應該是蠻好用的空模式的第一場比賽。但通常我可能更喜歡/^/匹配字符串開始每個字符串。

[\s\S]shorts用於與一個character class非空格一起空格)指剛任何字符,通常用於line-break related也匹配換行符其中不存在可用於做出the dot匹配換行符標誌。通常與JS regex which does not support s flag一起使用。類似的是[\D\d](數字和非數字),[\w\W](單詞字符和非單詞字符)。 JS正則表達式也可能是[^]否定空字符類爲「不是沒有」。

要使用/[\s\S]/或其中一個沒有量詞的人將需要至少一個字符。

此外要提到的是,在你的模式中,你可以使用u標誌作爲unicode正則表達式。可能沒有理由將這個標誌和一個空的模式一起使用,或者只是檢查字符串的開始。有趣的pcre unicode regex可能是以下轉義序列。

好了,我真的不明白爲什麼人會需要一個模式來匹配任何字符串,而是寫了興趣:)

1

是的你是對的。另一種選擇是/.?/。有很多可能性來接受所有的字符串。

+0

非常感謝您的時間。所以這個空的正則表達式可以安全地用來匹配任何字符串?這是什麼意思?這不是假設,匹配**空字符串!**? –