Regex - lookahead assertion
I have problem with lookahead assertion (?=). Fo开发者_StackOverflow中文版r example, I have expression:
/Win(?=2000)/
It match Win
, if expression is like Win2000
, Win2000fgF
. I have next expression:
^(?=.*\d)(?=.*[a-z]).*$
It match for digit and lower case letter, for example: 45dF
, 4Dd
. But I don't know, why it works and match all characters :) I haven't characters, which are before (?=.*\d)
. I think, only this expression should work:
^.\*(?=.*\d)(?=.*[a-z]).*$
(with \*
before expression).
Could you explain it?
Let's say we are the regex engine and apply the regex ^(?=.*\d)(?=.*[a-z]).*$
to the string 2a
.
Starting at position 0 (before the first character):
^
: Make sure we're at the start of the string: OK(?=
: Let's check if the following regex could match....*
: match any number of characters ->2a
. OK.\d
: Nope, we're already at the end. Let's go back one character:a
--> No, doesn't match. Go back another one:2
--> MATCH!)
: End of lookahead, match successful. We're still at position 0!(?=
: Let's check if the following regex could match....*
: match any number of characters ->2a
. OK.[a-z]
: Nope, we're already at the end. Let's go back one character:a
--> MATCH!)
: End of lookahead, match successful. We're still at position 0!.*
: match any number of characters ->2a
--> MATCH!$
: Let's see - are we at the end of the string? Yes, we are! --> MATCH!- Hey, we've reached the end of the regex. Great. Match completed!
lookaheads don't match, they assert.
this means that if you use a lookahead, you need something that will match what you want if you want to go any further.
精彩评论