Regex - lookahead assertion
regex, regex-lookarounds
Solution
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!
Problem
I have problem with lookahead assertion (?=). For 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?