문자열 "abc 123"과 일치합니다. abc와 123을 꺼내달라고 요청하세요.
<코드><?php $str = "abc 123"; $preg = "/^(.*?)\s+(.*?)$/"; $preg1 = "/^(.*?)\s*(.*?)$/"; preg_match($preg, $str, $tmp); preg_match($preg1, $str, $tmp1); echo '<pre>'; print_r($tmp); print_r($tmp1); echo '</pre>'; // $tmp 정렬 ( [0] => [1] => [2] => 123 ) // $tmp1 정렬 ( [0] => [1] => [2] => ABC 123 )
왜 일치 결과가 다른가요? 주의해야 할 사항이 있나요?
伊谢尔伦2017-05-16 13:10:16
처음 두 학생 중 어느 누구도 요점에 대답하지 않았습니다.
대답해드릴게요
게으른(또는 탐욕스럽지 않은) 매칭
규칙에 있습니다:惰性(或叫非贪婪)匹配
的规则:
星号或加号后跟个问号,就表示惰性匹配,意思是尽可能少的匹配。
/(.*?)s+/
,加号表示前面的匹配(也就是空格s) 出现1次或多次。 这段的意思是尽可能少的匹配,后面至少有一个空格s。 这么看,前面这个括号它能匹配到 abc。
/(.*?)s*/
별표 또는 더하기 기호 뒤에 물음표가 있으면 지연 일치를 나타냅니다. 즉, 가능한 한 적게 일치함을 의미합니다.
/(.*?)s+/
에서 더하기 기호는 이전 일치 항목(즉, 공백 s)이 한 번 이상 나타남을 나타냅니다. 이 단락은 가능한 한 적게 일치하고 그 뒤에 최소한 하나의 공백이 오는 것을 의미합니다. 이렇게 보면 앞의 괄호가 abc와 일치할 수 있습니다. /(.*?)s*/
, 별표는 이전 일치 항목(즉, 공백 s)이 0회 이상 나타남을 나타냅니다. 이 단락의 의미는 가능한 한 적게 일치한다는 것이며 그 뒤에는 아무것도 없을 수 있습니다(s*). 결과적으로 아무것도 일치하지 않는 빈 문자열이 생성됩니다. 🎜🎜
🎜阿神2017-05-16 13:10:16
일반 와일드카드 s+와 s*의 결과는 확실히 다릅니다. "*"
이전 하위 표현식과 0회 이상 일치합니다. 예를 들어 zo"*"
匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。"+"
는 "z" 및 "zoo"와 일치합니다.
"+"
이전 하위 표현식을 한 번 이상 일치시킵니다. 예를 들어, "zo+"는 "zo" 및 "zoo"와 일치하지만 "z"는 일치하지 않습니다. +는 {1,}과 같습니다.
/^(.
?)$/
앞의 "/"와 뒤의 "/"는 시작과 끝이 실질적인 의미가 없음을 나타냅니다.
첫 번째 "^"는 텍스트의 시작 부분과 일치함을 의미합니다.
()는 왼쪽에서 오른쪽으로 우선순위를 나타냅니다. "."는 모든 문자와 일치함을 의미하고, "*"는 0번 이상 일치함을 의미합니다.
s는 공백 문자입니다
🎜학습할 튜토리얼 추천: 정규 표현식에 대한 30분 소개🎜PHPz2017-05-16 13:10:16
정답하세요. 이는 정규 표현식의 어려움 중 하나인 게으른 일치로 인해 발생합니다.
소위 게으른 일치는 대중적인 방식으로 이해될 수 있습니다. 앞에 뭔가가 있다고 말하지 않으면 진행되지 않습니다. 첫 번째 일반 규칙에서는 일치 항목으로 계산하기 위해 최소한 하나의 공백을 만나면 앞으로 진행하고 중지하도록 지시합니다.
두 번째 일반 규칙은 공백을 만날 필요가 없거나 공백을 만나면 일치하는 것으로 간주될 수 있다는 것입니다.