정규식 플러스 대 스타 차이?


91

차이점은 무엇입니까?

(.+?)

(.*?)

내 PHP preg_match정규식 에서 사용할 때 ?

답변:


150

이를 수량 자라고합니다.

* 0 개 이상의 선행 표현식

+ 앞의 표현식 중 하나 이상

기본적으로 수량자는 탐욕 스럽기 때문에 가능한 한 많은 문자와 일치합니다.

?한정사 후, "ungreedy"는 가능한 한 적게 일치 수단을이 정량을 만들기 위해 동작을 변경합니다.

탐욕스러운 / 배고픈 예

예를 들어 " abab " 문자열

a.*b "abab"과 일치합니다 (preg_match_all은 하나의 일치, "abab"을 반환합니다).

while a.*?b은 시작 "ab"와만 일치합니다 (preg_match_all은 두 개의 일치 "ab"를 반환 함).

예를 들어 Regexr에서 온라인으로 정규식을 테스트 할 수 있습니다. 여기 욕심 많은 예제를 참조하십시오.


2
"게으른" "ungreedy"에 대한 일반적인 용어입니다
월터 Tross

예가 잘못되었습니다. 모두 (.+?)하고 (.*?)있는 정규 표현식의 다양한 위치에서 다르게 행동 a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
Louis55

a. * b가 "ab"를 돌려주지 않는 이유는 무엇입니까? 따라서 "a와 b 사이에 0 개 이상의 문자가있는 단어"라는 말이 아닌가? 따라서 ab는 사이에 문자가 0 개이고 일치 할 수 있습니다. 이것이 잘못된 이유는 무엇입니까?
Hello World

@HelloWorld, 이것은 내가 위에서 설명한 욕심과 관련이 있습니다. .*가능한 한 많이 일치합니다. 가능한 한 일찍 중지하려면, 당신은 그것을 ungreedy 확인해야.*?
STEMA

22

첫 번째 ( +)는 하나 이상의 문자 입니다. 두 번째 ( *)는 0 개 이상의 문자 입니다. 둘 다 탐욕스럽지 않고 ( ?) 무엇이든 일치합니다 ( .).


1
s 수정자가 설정되었는지 여부에 따라 다릅니다.
Quentin

8

A 는 이전 패턴의 하나 이상의 인스턴스 +와 일치 합니다. A 는 0 개 이상의 일치* 는 이전 패턴의 인스턴스 .

따라서 기본적으로 a를 사용하는 +경우 패턴의 인스턴스가 하나 이상 있어야하며, 사용 *하면 인스턴스가없는 경우에도 여전히 일치합니다.


8

+ 하나 이상의 문자와 일치

* 모든 문자 (0 포함)와 일치

?그것이 가능한 몇 가지 문자로 일치하므로, 게으른 표현을 나타냅니다.


8

다음은 일치시킬 문자열입니다.

ab

패턴 (ab.*)은 다음의 결과와 함께 캡처 그룹에 대한 일치를 반환합니다.ab

패턴 (ab.+)이 일치하지 않고 아무것도 반환하지 않습니다.

그러나 문자열을 다음으로 변경하면 aba패턴에 대해 반환 됩니다.(ab.+)

aba

나는이 * 대 +의 질문에 특별히 더 나은 답을 생각
테렌스

6

+최소 1이고 *0 일 수도 있습니다.


"+ is minimal one"이 문장은 무엇을 의미합니까?
Det

5

정규식에서 {i,f}"사이 뜻 if일치". 다음 예를 살펴 보겠습니다.

  • {3,7} 3 ~ 7 개 일치를 의미합니다.
  • {,10} 하한이없는 최대 10 개의 일치를 의미합니다 (즉, 하한이 0 임).
  • {3,} 상한이없는 최소 3 개의 일치를 의미합니다 (즉, 상한이 무한대 임).
  • {,} 일치 수에 대한 상한 또는 하한이 없음을 의미합니다 (즉, 하한은 0이고 상한은 무한대).
  • {5} 정확히 4를 의미합니다.

대부분의 좋은 언어에는 약어가 포함되어 있으므로 RegEx도 마찬가지입니다.

  • + 의 약어입니다 {1,}
  • * 의 약어입니다 {,}
  • ? 의 약어입니다 {,1}

+, 하나 이상의 일치가 필요하고 일치하는 *수에 관계없이 일치하거나 전혀 일치 ?하지 않으며 1 개 이하의 일치 ​​또는 0 개 일치를 허용하지 않습니다.

크레딧 : Codecademy.com


4

별은 플러스와 매우 유사하지만, 유일한 차이점은 플러스가 앞의 문자 / 그룹 중 하나 이상과 일치하는 반면 별은 0 이상과 일치한다는 것입니다.


2

이전 답변은 간단한 예를 강조하지 못한다고 생각합니다.

예를 들어 배열이 있습니다.

numbers = [5, 15]

다음 정규식 표현식이 ^[0-9]+일치 15합니다. 그러나 ^[0-9]*모두 일치합니다 5 and 15. 차이점은 +연산자 에 이전 정규식의 중복 이 하나 이상 필요 하다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.