解释正则表达式

时间:2012-03-01 08:03:20

标签: php regex

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

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

之间有什么不同

我有作弊表,但还没完全搞定。我所知道的*获得 所有的人物,那是什么。*?是为了!

以上模式用于PHP preg_match和preg_replace。

2 个答案:

答案 0 :(得分:5)

  • . matches any character (roughly)
  • *?是一个所谓的quantifier,与前一个令牌至少匹配零次(并且只需要完成匹配所需的频率 - 它是懒惰的,因此?
  • (...)创建一个capturing group,您可以在正则表达式或匹配中引用。它们还用于限制|交替的范围仅限于正则表达式的部分(就像数学中的括号使优先级清晰一样)。
  • /.../#...#是整个正则表达式的分隔符,至少在PHP中。从技术上讲,它们不是正则表达式语法的一部分。您使用的分隔符取决于您(但我认为您不能使用\),并且主要更改您需要在正则表达式中转义的字符。因此,当您匹配可能包含大量斜杠的URI时,/是一个糟糕的选择。比较以下两个varaints以查找C ++样式的行尾注释:

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

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

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

下次你花时间阅读Regular-Expressions.info时,它是关于正则表达式基础知识和先进主题的绝佳参考,能很好地解释很多事情。另请在这方面查看PHP documentation

答案 1 :(得分:1)

嗯,请坚持每个问题的一个实际问题。

这是对问题3 + 4的回答,因为其他问题已经得到了解答。

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