空正则表达式匹配任何字符串

时间:2017-08-13 22:55:35

标签: php regex preg-match

我试图找到一个匹配任何字符串的正则表达式!经过一些搜索,我发现几乎所有的答案都表示[\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

我可以安全地使用这个空的正则表达式来匹配任何东西吗?空正则表达式意味着什么?

如果你问为什么我需要一个匹配任何东西的正则表达式,那是因为我使用的函数需要一个正则表达式参数作为它的字符串验证功能的一部分,我想要它接受任何东西。

2 个答案:

答案 0 :(得分: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 regex也可能是[^]一个否定的空字符类,用于“not nothing”。

要使用/[\s\S]/或其中一个没有量词的人,至少需要一个字符。

进一步提到在你的模式中,你使用u标志来表示unicode正则表达式。可能没有理由将此标志与空模式一起使用或仅检查字符串的开头。有趣的是pcre unicode regex可能是以下转义序列。

好吧,我真的不明白为什么人们需要一个匹配任何字符串的模式,但为了兴趣写道:)

答案 1 :(得分:1)

是的,你是对的。另一种选择是/.?/。接受所有字符串有很多种可能性。

相关问题