2013-03-11 2 views
1

정규 표현식에서 (.*)(.*?)의 차이점은 무엇입니까?정규 표현식에서 (. *)와 (. *?)의 차이점은 무엇입니까?

<select name="show"> 
    <option value="all"  >all php.net sites</option> 
    <option value="local" >this mirror only</option> 
    <option value="quickref" selected="selected">function list</option> 
    <option value="manual" >online documentation</option> 
    <option value="bugdb" >bug database</option> 
    <option value="news_archive">Site News Archive</option> 
    <option value="changelogs">All Changelogs</option> 
    <option value="pear"  >just pear.php.net</option> 
    <option value="pecl"  >just pecl.php.net</option> 
    <option value="talks" >just talks.php.net</option> 
    <option value="maillist" >general mailing list</option> 
    <option value="devlist" >developer mailing list</option> 
    <option value="phpdoc" >documentation mailing list</option> 
</select> 

정규 표현식 : /<option\svalue=(.*)>/s

반환 모든 옵션 값을 포함하는 단일 문자열을 하나 개의 결과

나는 다음과 같은 문자열을 사용했다.

정규 표현식 : /<option\svalue=(.*?)>/s

(13 개) 결과를 돌려줍니다.

출력을 관찰하면 끝에서 .* 검색을 찾고 처음부터 .*? 검색을 찾는 것이 올바른 가정입니까?

+0

http://stackoverflow.com/questions/3075130/difference-between-and-for-regex/3075532#3075532 –

답변

5

‍‍.*?.*? 다음 패턴이 나타날 때까지 문자와 일치합니다.입니다. 하지만 .*은 모든 문자와 일치합니다.

hellohello에서 h.*ohellohello과 일치합니다. 그러나 h.*?ohello과 일치합니다.

.*을 욕심이라하며 .*?을 비 탐욕이라고합니다.

+0

잘못된 설명입니다. 카운터 예제 :'/h.*?o $ /' – ikegami

+1

@ikegami'$ '는 앵커입니다. 이 * 앵커 *는 끝 부분에 패턴을 고정시킵니다. 그래서 여기서'. *? '는 끝에있는'o '가 발견되지 않으면 일치를 시작합니다. –

2

?reluctant quantifier이며 "욕심이 많지 않습니다." 그것없이 정규 표현식은 가능한 한 많이 일치 시키려고 시도합니다 (기본값). 그것이 "욕심"이라고 불리는 이유입니다. "마지 못해"한정 기호로, 정규식은 일치를 만족시킬 수있는 한 적은 일치하려고합니다.

2

정규식은 기본적으로 탐욕스럽게 매치합니다. ?은 대신 게으르게 만듭니다.

0

욕심 및 비 욕심이 일치

펄 정규 표현식은 일반적으로 가능한 가장 긴 문자열을 일치합니다. 예를 들어 :

my($text) = "mississippi"; 
$text =~ m/(i.*s)/; 
print $1 . "\n"; 

는 앞의 코드를 실행하고 여기에 당신이 무엇을 얻을 :

ississ 

그것은 그들 사이의 첫 번째 전, 마지막의, 그리고 모든 것을 일치합니다. 그러나 처음 i와 가장 가까운 i를 일치 시키려면 어떻게해야할까요? 이 코드를 사용

my($text) = "mississippi"; 
$text =~ m/(i.*?s)/; 
print $1 . "\n"; 

이제 코드가 생성하는 것을 보면 :

is 

분명히, 물음표의 사용은 경기가 비 욕심이 있습니다. 그러나 정규 표현식이 항상 가능한 일찍 일치하려고하는 또 다른 문제점이 있습니다.

관련 문제