lists@xxxxxxxxxxx wrote: > Hi, > > I was not having PHP on the machine I am reading this email for the > moment. But I tried to use it together with egrep, but it didn't work. > Maybe egrep is using different syntax for these lookaheads, but with > other tests it has been working same as for preg_match in PHP. As you > see the first simple example works, but fails when I insert the lookahead. > > [peternokia@localhost ~]$ echo 0123 | egrep '^[0-9]{4}$' > 0123 > [peternokia@localhost ~]$ echo 0123 | egrep '^(?=.*2.*)[0-9]{4}$' > [peternokia@localhost ~]$ > I couldn't get egrep to work either but the following cmdline output shows that the given regexp will do the job with preg_match: tina:~# php -r ' echo preg_match("#^(?=\\d*8\\d*)[0-9]{4}\$#", "8123"),"\n"; ' 1 tina:~# php -r ' echo preg_match("#^(?=\\d*8\\d*)[0-9]{4}\$#", "08123"),"\n"; ' 0 tina:~# php -r ' echo preg_match("#^(?=\\d*8\\d*)[0-9]{4}\$#", "0812"),"\n"; ' 1 tina:~# php -r ' echo preg_match("#^(?=\\d*8\\d*)[0-9]{4}\$#", "20812"),"\n"; ' 0 tina:~# php -r ' echo preg_match("#^(?=\\d*8\\d*)[0-9]{4}\$#", "2081"),"\n"; ' 1 tina:~# php -r ' echo preg_match("#^(?=\\d*8\\d*)[0-9]{4}\$#", "2008"),"\n"; ' 1 > /Peter > > > > Quoting Martin Alterisio <malterisio777@xxxxxxxxx>: > >> PS: I think you can remove the last .*, leaving the assertion like this: >> (?=.*8), and it will still work fine and probably faster (which dosen't >> matter under these conditions). But I haven't tried that one (and have >> already erased the test file I did to check the regular expression). >> >> 2007/2/9, Martin Alterisio <malterisio777@xxxxxxxxx>: >>> >>> If you want to do it in one regular expression, without listing each >>> case, >>> you can use a lookahead assertion: >>> >>> /^(?=.*8.*)[0-9]{4}$/ >>> >>> The assertion (?=.*8.*) checks that the following matches the expression >>> contained (.*8.*) which fails if there is not an 8. >>> >>> 2007/2/9, Peter Lauri <lists@xxxxxxxxxxx>: >>>> >>>> Best group member, >>>> >>>> >>>> >>>> I want to match a four digit number. I allow user to enter with * >>>> syntax. So >>>> 8* would match anything that starts with 8 and is 4 digit long so: >>>> >>>> >>>> >>>> /^8[0-9]{3}$/ >>>> >>>> >>>> >>>> That was easy. Ok then my other case was: *8, so anything that ends >>>> with >>>> 8 >>>> >>>> >>>> >>>> /^[0-9]{3}8$/ >>>> >>>> >>>> >>>> Ok, now the tricky one comes: *8*, so match it incase 8 is anywhere in >>>> the >>>> number. Can be beginning, end or in the middle. The problem that I face >>>> I >>>> cannot find out a good way of doing this correctly. So I ended up with >>>> an >>>> expression like this: >>>> >>>> >>>> >>>> /^(8[0-9]{3}|[0-9]8[0-9]{2}|[0-9]{2}8[0-9]|[0-9]{3}8)$/ >>>> >>>> >>>> >>>> This takes care of it and everything, BUT it is so ugly. What I >>>> actually >>>> >>>> need to construct is: A regular expression that checks if 8 is a >>>> part of >>>> the >>>> number, and then that it is four digit long. >>>> >>>> >>>> >>>> The pipe "|" is an OR operator, but are there not any "AND" operator in >>>> Regular Expressions? I have been trying to figure this out for a while >>>> now. >>>> Of course I am using the above syntax right now, but would like to >>>> strip >>>> it >>>> down. Maybe not for the performance, but for the beauty of it :-) >>>> >>>> >>>> >>>> If you have any comments and suggestions about this I would be happy. >>>> >>>> >>>> >>>> Best regards, >>>> >>>> Peter Lauri >>>> >>>> >>>> >>>> <http://www.dwsasia.com/> www.dwsasia.com - company web site >>>> >>>> <http://www.lauri.se/> www.lauri.se - personal web site >>>> >>>> < http://www.carbonfree.org.uk/> www.carbonfree.org.uk - become Carbon >>>> Free >>>> >>>> >>>> >>>> >>> > > --PHP General Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php