【问题标题】:empty regex matches any string空正则表达式匹配任何字符串
【发布时间】:2017-08-13 22:55:34
【问题描述】:

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

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

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

【问题讨论】:

  • 不匹配字符串的正则表达式不是正则表达式。只需执行if($string == "")if (strlen($string)== 0)
  • @Ibu 谢谢。但我必须将任何正则表达式传递给验证字符串的函数。
  • 你的第一个条件应该是先检查字符串是否为空,然后进入正则表达式

标签: php regex preg-match


【解决方案1】:

一个空的正则表达式模式// 匹配字符串中字符之间的开始、结束和任何位置。在 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 有趣的可能是以下转义序列。

  • \X 匹配一个 unicode 字形。类似于u-mode 中的点(但不是换行符)。
  • \C 匹配一个数据单元(similar using the dot without u flag 在 unicode 输入上)。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢您的宝贵时间。那么这个空的正则表达式可以安全地用于匹配任何字符串吗?这是什么意思?不是说,匹配 empty string! 吗?
    猜你喜欢
    • 2023-03-13
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多