正则表达式中的^。*和。* $是什么?

时间:2011-11-30 14:46:38

标签: regex

有人可以解释这些角色的含义。我看了他们,但我似乎没有得到它。

整个正则表达式是:

/^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/

基本上是正则表达式和结束字符的开头。

7 个答案:

答案 0 :(得分:30)

  • .表示“任何角色”。
  • *表示“任意数量”。
  • .*因此意味着任意长度的任意字符串。
  • ^表示字符串的开头。
  • $表示字符串的结尾。

正则表达式表示:表达式(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])与搜索字符串的开头和结尾之间可能有任意数量的字符。

答案 1 :(得分:13)

^.* //Start of string followed by zero or more of any character (except line break)

.*$ //Zero or more of any character (except line break) followed by end of string

所以当你看到这个......

(?=.*[@#$%^&+=]).*$

它允许任何字符(换行符除外)介于(?=.*[@#$%^&+=])和字符串结尾之间。

要显示.与任何字符都不匹配,请尝试以下操作:

/./.test('\n');  is false

要实际匹配任何字符,您需要的内容更像[\s\S]

/[\s\S]/.test('\n') is true

答案 2 :(得分:5)

主要文件:http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

/^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/
12345   6         7                                  89

1 - start of pattern, can be almost any character, and must have a matching character at the END of the pattern (see #9 below)
2 - anchors the pattern to the start of a line of text
3 - `.` matches any character
4 - a modifier, "0 or more of whatever came before"
  - `.*` means "0 or more of ANY characters"
5 - A positive lookahead assertion: http://www.php.net/manual/en/regexp.reference.assertions.php
6 - A repetition indictor: http://www.php.net/manual/en/regexp.reference.repetition.php
  - `{8,}` = "at least 8 of whatever came previously"
  - `.{8,}` = "at least 8 'any' characters"
7 - A character class: http://www.php.net/manual/en/regexp.reference.character-classes.php
  - `[a-z]` - any one character in the range 'a' - 'z' (the lower case alphabet)
8 - anchors the pattern to the end of the line
9 - end of the pattern, must match character used in #1 above.

答案 3 :(得分:4)

这匹配行的开头(^)后跟任何字符(。*):

^.*

这匹配任何字符(。*)前面的行尾($):

.*$

答案 4 :(得分:1)

  

^

匹配字符串的开头

  

$

匹配结尾

  

*

是任意数量的字符

答案 5 :(得分:0)

我将来帮助你的其他事情:

.*$
在给定此字符串的情况下,

将匹配两次:"1"

如果你想知道为什么,它是因为它消耗所有字符,但之后也没有任何匹配。所以空字符串也是一个匹配。

答案 6 :(得分:0)

这看起来像典型的密码验证正则表达式,除了它有几个错误。首先,开头的.*不属于那里。如果这些前瞻中的任何一个在字符串的开头没有成功,那么在下一个位置或下一个位置再次应用它们是没有意义的。

其次,虽然正则表达式确保这三种角色中的每一种都存在,但它没有说明字符串的其余部分。这可能是一个慎重的选择,但人们通常会尝试确保只有 这些字符存在。在这种情况下,您可能希望将第一个前瞻从(?=.{8,})更改为(?=[A-Za-z@#$%^&+=]{8,}$)

最终结果:

/^(?=[A-Za-z@#$%^&+=]{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/