Rust에서 Regex 살펴보기(부록)

14967 단어 rustregexlearning
안녕. 내 이전 기사에서




몇 가지 기본 사항을 다뤘습니다. 오늘은 정규 표현식에서 처리해야 하는 사항을 확장하면서 배운 몇 가지 새로운 사항을 살펴보겠습니다. 특히 한정자 + , - , ~ , ? 의 존재 여부를 처리해야 할 필요성이 있습니다.

요약:



전체 기사를 읽고 싶지 않다면. 여기에 하이라이트를 두겠습니다.

  • (x?)와 같은 정규식 패턴의 결과는 다음과 같습니다.
  • x가 없으면 결과 캡처는 Some("")가 됩니다.
  • x가 있는 경우 캡처 결과는 Some("x")입니다.


  • 해결책은 (x)? 를 수행하여 캡처 내용이 아니라 캡처 자체를 선택 사항으로 만드는 것입니다.
  • x가 없으면 결과 캡처는 None가 됩니다.
  • x가 있는 경우 결과 캡처는 Some(x)입니다.


  • 정규식 크레이트는 기본적으로 여러 줄로 되어 있습니다.
  • 활성화할 필요가 없습니다.
  • 여러 줄을 원하지 않는 경우 (?-m)를 사용하여 비활성화할 수 있습니다.



  • 한정자에 대한 지원 추가



    내 초기 정규식이 꽤 좋아 보이기 시작했습니다. 하지만 예선 처리가 필요하다는 것을 기억했습니다. 이것은 새로운 일련의 발견으로 이어집니다.

    한정자가 없는 내 초기 시도는 다음과 같습니다.




    출력을 준 것은




    Compiling playground v0.0.1 (/playground)
     Finished dev [unoptimized + debuginfo] target(s) in 1.85s
      Running `target/debug/playground`
    Standard Output
    Some(Captures({0: Some("a"), "a_only": Some("a"),
                  "a_colon": None, "a_slash": None}))
    Some(Captures({0: Some("a:example.com"), "a_only": None, 
                  "a_colon": Some("example.com"), "a_slash": None}))
    Some(Captures({0: Some("a:mailers.example.com"), "a_only": None, 
                  "a_colon": Some("mailers.example.com"), "a_slash": None}))
    Some(Captures({0: Some("a/24"), "a_only": None, 
                  "a_colon": None, "a_slash": Some("a/24")}))
    Some(Captures({0: Some("a:offsite.example.com/24]"), "a_only": None, 
                  "a_colon": Some("offsite.example.com/24]"), "a_slash": None}))
    


    Rust Playgound


    Gist Link


    믹스에 예선 추가



    이제 한정자를 처리해야 했습니다. 존재하거나 존재하지 않을 수 있습니다. 내가 끝낸 새로운 정규식:
    /^(?P<qualifier>[+?~-])?(?P<is_a>a)(?:[:])?(?P<a_mechanism>.+)?/gmi



    Regex101 Link



    이것을 조금 분석해 보겠습니다.



    <올>
  • ^ 줄/문자열이 시작됩니다
  • .
  • (?P<qualifier>[+?~-])? . + , ? , ~ , - 가 존재합니다. 또는 캡처 자체는 ()?? 로 끝나므로 아무것도 찾을 수 없습니다. -의 위치도 중요합니다. 목록의 마지막 항목이어야 합니다.
  • (?P<is_a>a) . a 문자가 있습니다. (예. 이 캡처는 이제 정말 중복됩니다.)
  • (?:[:])? : 문자가 있을 수 있습니다. 이는 비캡처 그룹으로 묶이므로 선택 사항으로 정의할 수 있습니다.
  • (?P<a_mechanism>.+)? . 존재하는 다른 텍스트를 캡처합니다. 다시 이 전체 캡처는 선택 사항입니다. 메커니즘은 완전한 레코드로 a만 포함할 수 있습니다.

  • 결과


    ^ 문자 없이



    Rust Playground


    Gist




    <script id="gist-ltag"src="https://gist.github.com/rust-play/28f6c3775c6e8c2cf724f722d2bacb42.js"/>


    출력




    Compiling playground v0.0.1 (/playground)
     Finished dev [unoptimized + debuginfo] target(s) in 3.37s
      Running `target/debug/playground`
    Standard Output
    None
    Some(Captures({0: Some("a:example.com"), "qualifier": None, 
                  "mechamism": Some("example.com")}))
    Some(Captures({0: Some("~a:example.com"), "qualifier": Some("~"), 
                  "mechamism": Some("example.com")}))
    Some(Captures({0: Some("a:mailers.example.com"), "qualifier": None, 
                  "mechamism": Some("mailers.example.com")}))
    Some(Captures({0: Some("-a:mailers.example.com"), "qualifier": Some("-"), 
                  "mechamism": Some("mailers.example.com")}))
    Some(Captures({0: Some("a/24"), "qualifier": None, 
                  "mechamism": Some("/24")}))
    Some(Captures({0: Some("-a:offsite.example.com/24]"), "qualifier": Some("-"), 
                  "mechamism": Some("offsite.example.com/24]")}))
    None
    Some(Captures({0: Some("ailer.com.au"), "qualifier": None, 
                  "mechamism": Some("iler.com.au")}))
    


    a의 첫 번째 테스트 데이터가 None를 제공한다는 점에 유의하십시오. 이는 올바르지 않습니다. 또한 +mx:mailer.com.auSome("iler.com.au")의 메커니즘과 일치합니다. 이 또한 올바르지 않습니다.


    ^ 문자 사용



    Rust Playground


    Gist




    <script id="gist-ltag"src="https://gist.github.com/rust-play/d4c319363d377eb2c352740bd0b93013.js"/>


    (?Pa) 재도입됨


    출력




    Compiling playground v0.0.1 (/playground)
     Finished dev [unoptimized + debuginfo] target(s) in 2.26s
      Running `target/debug/playground`
    Standard Output
    Some(Captures({0: Some("a"), "qualifier": None, "is_a": Some("a"), 
                  "mechamism": None}))
    Some(Captures({0: Some("a:example.com"), "qualifier": None, "is_a": Some("a"),      
                  "mechamism": Some("example.com")}))
    Some(Captures({0: Some("~a:example.com"), "qualifier": Some("~"), "is_a": Some("a"), 
                  "mechamism": Some("example.com")}))
    Some(Captures({0: Some("a:mailers.example.com"), "qualifier": None, "is_a": Some("a"), 
                  "mechamism": Some("mailers.example.com")}))
    Some(Captures({0: Some("-a:mailers.example.com"), "qualifier": Some("-"), "is_a": Some("a"), 
                  "mechamism": Some("mailers.example.com")}))
    Some(Captures({0: Some("a/24"), "qualifier": None, "is_a": Some("a"), 
                  "mechamism": Some("/24")}))
    Some(Captures({0: Some("-a:offsite.example.com/24]"), "qualifier": Some("-"), "is_a": Some("a"), 
                  "mechamism": Some("offsite.example.com/24]")}))
    None
    None
    


    ^ 문자가 있으면 이제 정규 표현식이 올바르게 작동합니다. 성공적으로 a 일치하고 mx 또는 +mx:mailer.com 일치하지 않습니다. 캡처가 없을 때 필요한 항목None도 있습니다.



    결론



    Some("")가 아닌 (x)?로 캡처 자체를 선택 사항으로 표시하여 캡처(x?)를 방지합니다.


    Rust Regex 크레이트는 기본적으로 여러 줄입니다.



    읽어주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기