2012-04-11 6 views
1

나는 정규 표현식에 대해 조금 배우려고하고있다. 아무도 나에게 여기서 무슨 일이 일어나는지 설명 할 수 있을까? 예상 출력을 제공하는 정규식 예제를 제공 하시겠습니까? 감사!왜이 욕심이 많은 정규 표현식이 예상대로 작동하지 않습니까?

preg_filter("(.*)?\|?.*", "$1", 'Sometext|even more text'); // returns Sometext|even more text 
+1

PHP 코드도 함께 보내주십시오. – hakre

+0

'\ |? '는 세로 막대를 선택적으로 만듭니다. – nickb

답변

1

(.*)

input data = 'Sometext|even more text' 

regex = '(.*)?\|?.*' 

replacement = '$1' 

expected output = 'Sometext' 

actual output = 'Sometext|even more text' 

PHP 그래서 모든 것을 일치 욕심이다. 그러면 $1이 전부입니다. 귀하의 정규식 "0 개 이상의 문자 다음에 선택적인 | 다음에 모든 문자를,"말하는

/^([^|]*).*$/ 
+0

그리고 탐욕스럽지 않은 (. *) 모양은 어떻습니까? – netbrain

+1

@netbrain :'(. *?)'그러나 match-all 연산자를 사용하지 않고 @hakre와 같이 일치시키지 않으려는 문자를 제외하는 것이 좋습니다. –

+1

'?'를 추가하여 욕심이 없도록 만듭니다. 그러나, 당신이 이해하고 싶지는 않지만 단지 코드를 가지고 있기 때문에 답을 편집했습니다. – hakre

1

:

당신은 아마 찾고 있습니다.

(.*)([^\|]*)으로 변경하거나 |을 선택 사항이 아닌 것으로 변경하십시오.

1

*은 욕심이 많습니다. 가능한 한 많은 텍스트를 검색하려고합니다. 이 경우 :

  • (.*)?는 모든 텍스트와 일치합니다
  • \|?.* 일치하는 것 "휴식"(빈 문자열)

시도 :

1

당신이 (\w+)?\|?.*에 정규식을 변경하는 경우 regex = '\|[^|]*', replacement = '' 특히 \w 다음에 +을 추가하면 'Sometext'에 대한 예상 답변을 얻을 수 있습니다.

전체 문자열 일치가 발생한 이유는 첫 번째 .*이 전체 문자열과 일치했기 때문입니다. 위의 변경 사항을 적용하면 모든 단어의 문자와 일치하게됩니다.

관련 문제