【问题标题】:what does $ and * means in PCRE (Regular Expression)?在 PCRE(正则表达式)中 $ 和 * 是什么意思?
【发布时间】:2011-06-07 05:44:51
【问题描述】:

我正在使用验证电子邮件地址的正则表达式,这是我正在使用的正则表达式。

preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/", $email)

上面的大部分代码都是不言自明的

a) ^ 代表 NOT。

b) 字符串的开头应该是_ a-z 0-9

c) 匹配下一个以点开头的字符

d) 现在 *@ 在这里是什么意思,难道只是 @ 意味着下一个字符应该是 @

e) 接下来它会再次尝试查找点,第一个点是可选的,第二个是强制性的。

f) $到底是什么意思?

【问题讨论】:

  • ^ 在这种情况下不代表“NOT”。它只在字符类中这样做(并且仅当它是第一个字符时):[^abc]`。这里它的意思是“字符串的开始”。
  • 另外,这个表述是错误的。它应该以(\.[a-z]{2,})$/ 结尾。否则,您将忽略 .areo、.coop、.info、.museum、.name、.local 或 .localdomain TLD,或任何出现的新 gTLD。
  • @Thomas... 这种模式的错误远不止于此。
  • 虽然我不知道你们的开发平台,但是“regex buddy”是一款非常棒的软件,可以帮助理解windows环境下的正则表达式。

标签: php regex pcre


【解决方案1】:

你的假设 a) 不正确

^ 在这种情况下是字符串的开头。在字符类的开头是 NOT。

[_a-z0-9-]+ 将匹配[] 中的任何字符一次或多次(因为+

(\.[_a-z0-9-]+)* 那么有一个点与之前的模式相同,* 表示这个完整的部分可以重复 0 次或多次

那么一定有@这个角色

然后@之前的部分重复

(\.[a-z]{2,3})$ 字符串必须以 . 和 2 或 3 个小写字母结尾(由 $ 定义)

【讨论】:

  • 在这种情况下,^ 可能是一行或字符串的开头。要使^(字符类之外)严格要求字符串的开头,必须使用s 修饰符(/s(?s))。
  • @eyelidlessness 是的,在这种情况下它是字符串的开头。在字符类的开头是NOTm(多行)修饰符更改^ 的行为,此修饰符还匹配行的开头。 s (dotall) 修饰符使. 匹配换行符。
  • 我的立场是正确的。我混淆了s(dotall)对.的影响与m(多行)对^$的影响。谢谢指正。
【解决方案2】:

* 表示前面的规则0次或多次

而 $ 在这种情况下表示字符串的结尾

(\.[_a-z0-9-]+)* // these characters can appear 0 or multiple times

(\.[a-z]{2,3})$ // the string ends with 2 letters in lowercase alphabet

【讨论】:

    【解决方案3】:

    很多关于正则表达式的信息可以在http://www.regular-expression.info找到

    例如:f) 参见http://www.regular-expressions.info/quickstart.html的§锚

    【讨论】:

      【解决方案4】:

      由于现有的答案没有涵盖这个......

      是的,* 的意思是“零次或多次”,但它默认也是“贪婪”的,所以它会尽可能多地匹配,即使部分匹配的字符串会导致下一部分要匹配的模式。 * 可以通过附加 ?: *? 来“延迟”(允许模式“回溯”以允许模式中的进一步匹配)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 2020-01-11
        相关资源
        最近更新 更多