찾다

 >  Q&A  >  본문

php - 두 정규 표현식의 효과가 다릅니다

문자열 "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
    )

왜 일치 결과가 다른가요? 주의해야 할 사항이 있나요?

ringa_leeringa_lee2810일 전541

모든 응답(3)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:10:16

    처음 두 학생 중 어느 누구도 요점에 대답하지 않았습니다.
    대답해드릴게요

    진짜 비밀은 게으른(또는 탐욕스럽지 않은) 매칭 규칙에 있습니다:

    惰性(或叫非贪婪)匹配的规则:

    星号或加号后跟个问号,就表示惰性匹配,意思是尽可能少的匹配。

    1. /(.*?)s+/,加号表示前面的匹配(也就是空格s) 出现1次或多次。 这段的意思是尽可能少的匹配,后面至少有一个空格s。 这么看,前面这个括号它能匹配到 abc。

    2. /(.*?)s*/별표 또는 더하기 기호 뒤에 물음표가 있으면 지연 일치를 나타냅니다. 즉, 가능한 한 적게 일치함을 의미합니다.

      <올>
    3. /(.*?)s+/에서 더하기 기호는 이전 일치 항목(즉, 공백 s)이 한 번 이상 나타남을 나타냅니다. 이 단락은 가능한 한 적게 일치하고 그 뒤에 최소한 하나의 공백이 오는 것을 의미합니다. 이렇게 보면 앞의 괄호가 abc와 일치할 수 있습니다.
    🎜
  • 🎜/(.*?)s*/, 별표는 이전 일치 항목(즉, 공백 s)이 0회 이상 나타남을 나타냅니다. 이 단락의 의미는 가능한 한 적게 일치한다는 것이며 그 뒤에는 아무것도 없을 수 있습니다(s*). 결과적으로 아무것도 일치하지 않는 빈 문자열이 생성됩니다. 🎜🎜 🎜

    회신하다
    0
  • 阿神

    阿神2017-05-16 13:10:16

    일반 와일드카드 s+와 s*의 결과는 확실히 다릅니다.
    "*" 이전 하위 표현식과 0회 이상 일치합니다. 예를 들어 zo"*" 匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。
    "+"는 "z" 및 "zoo"와 일치합니다.

    는 {0,}과 같습니다.

    "+" 이전 하위 표현식을 한 번 이상 일치시킵니다. 예를 들어, "zo+"는 "zo" 및 "zoo"와 일치하지만 "z"는 일치하지 않습니다. +는 {1,}과 같습니다. /^(.

    ?)s+(.

    ?)$/

    앞의 "/"와 뒤의 "/"는 시작과 끝이 실질적인 의미가 없음을 나타냅니다.
    첫 번째 "^"는 텍스트의 시작 부분과 일치함을 의미합니다.
    ()는 왼쪽에서 오른쪽으로 우선순위를 나타냅니다. "."는 모든 문자와 일치함을 의미하고, "*"는 0번 이상 일치함을 의미합니다.

    첫 번째 대괄호는 모든 문자와 일치함을 의미합니다. " ?" 비탐욕적 일치는 이전 문자 또는 하위 표현식을 0 또는 한 번 일치시키는 것을 의미합니다.

    s는 공백 문자입니다

    🎜학습할 튜토리얼 추천: 정규 표현식에 대한 30분 소개🎜

    회신하다
    0
  • PHPz

    PHPz2017-05-16 13:10:16

    정답하세요. 이는 정규 표현식의 어려움 중 하나인 게으른 일치로 인해 발생합니다.

    소위 게으른 일치는 대중적인 방식으로 이해될 수 있습니다. 앞에 뭔가가 있다고 말하지 않으면 진행되지 않습니다. 첫 번째 일반 규칙에서는 일치 항목으로 계산하기 위해 최소한 하나의 공백을 만나면 앞으로 진행하고 중지하도록 지시합니다.
    두 번째 일반 규칙은 공백을 만날 필요가 없거나 공백을 만나면 일치하는 것으로 간주될 수 있다는 것입니다.

    회신하다
    0
  • 취소회신하다