解释正则表达式


Explain Regular Expression

1. (.*?)
2. (*)
3. #regex#
4. /regex/

一个。上述符号是什么意思?B.# 和/有什么区别?

我有备忘单,但还没有完全拿到。我所知道的 * 得到所有字符,那又怎样.*?是为了!

上述模式用于 PHP preg_match 和 preg_replace。

  • .匹配任何字符(大致(。
  • *? 是一个所谓的量词,至少匹配前一个令牌零次(并且仅在完成匹配所需的时间内匹配 - 它是懒惰的,因此?(。
  • (...)创建一个可以在正则表达式或匹配中引用的捕获组。它们还用于将|交替的范围限制为仅正则表达式的一部分(就像数学中的括号明确优先级一样(。
  • /.../#...# 是整个正则表达式的分隔符,至少在 PHP 中是这样。从技术上讲,它们不是正则表达式语法的一部分。您使用什么分隔符取决于您(但我认为您不能使用 ' (,并且主要更改您需要在正则表达式中转义的字符。因此,当您匹配可能包含大量斜杠的 URI 时,/是一个糟糕的选择。比较以下两个变量,以查找C++样式的行尾注释:

    preg_match('/'/'/.*$/', $text);
    preg_match('#//.*$#', $text);
    

    后者更易于阅读,因为您不必在正则表达式本身中转义斜杠。 #@通常用作分隔符,因为它们很突出并且在文本中并不常见,但您可以使用任何您喜欢的东西。

    从技术上讲,您根本不需要此分隔符。这可能主要是PHP的Perl遗产的残余(在Perl中,正则表达式是分隔的,但不包含在字符串中(。其他使用字符串的语言(因为它们没有本机正则表达式文字(,如Java,C#或PowerShell,在没有分隔符的情况下表现良好。在 PHP 中,您可以在结束分隔符后添加选项,例如与aA匹配的/a/i(不区分大小写(,但正则表达式(?i)a完全相同,不需要分隔符。

下次您花时间通读 Regular-Expressions.info 时,它是关于正则表达式基础知识和高级主题的绝佳参考,可以很好地彻底地解释许多事情。也请看一下这方面的 PHP 文档。

好吧,请坚持每个问题一个实际问题...问题。

这是对问题3 + 4的回答,因为其他问题已经全部回答。

正则表达式通常由/分隔,例如/abc123/或/foo|bar/i。在 php 中,您可以使用任何您想要的字符。您不限于/,即您可以使用例如 # 或 %, #/usr/local/bin#。