/\s(?:(?!dar))win(?:dows)?\s?([0-9a-z]*)[\w\s]?([a-z0-9.]*)/i';
0 : ;
0 : ; win
0 : ; windows
1 : ; windows 98
0 : ; darwin
0 : ; darwindows
0 : ; ddd
0 : ; ad win
0 : ; aawindows
1 : ; dd windows 98
0 : ; adddddarwin
0 : ; addddd darwindows
1 : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR
1.1.4322)
0 : Mozilla/5.0 (X11; U; Darwin Power Macintosh; en-US; rv:1.1)
Gecko/20030114
참고로,
(?:foo) 는 'foo'를 그룹 문자열로 일치시키되 재참조 문자열로
취급하지 말라는 의미입니다.
그리고,
(?!foo)bar 는 'bar' 앞에 foo 가 아닌 것(!)에 일치합니다.
라고 설명하면 맞을것 같지만 이것은 틀린 설명입니다.
/(?!foo)bar/
0 : foo
1 : bar
1 : foobar
1 : foo bar
0 : some foo
1 : some bar
1 : some foobar
1 : some foo bar
따라서 (?!foo)bar 를 쉽게 이해하려면,
bar 가 기준이 아니고 (?!foo) 앞에 어떤 패턴을 명시해주는것이
좋습니다.
/some(?!foo)bar/ ===> (some) && !(foo) && (bar)
이런식으로... 'some 과 bar 사이에 foo가 들어가면 안된다'라는
패턴일치로 이해하는것이 좋을 것 같네요.
그외 PERL 에는 (?#...), (?=...) (?i)... (?<...) (?<=...)
등이 있습니다. 상당히 어렵더군요..(몇가지는
아직 이해가...)
|