Rust에서 Regex 살펴보기(부록)
Rust에서 정규식 보기
Adam.S ・ 4월 20일 ・ 3분 읽기
몇 가지 기본 사항을 다뤘습니다. 오늘은 정규 표현식에서 처리해야 하는 사항을 확장하면서 배운 몇 가지 새로운 사항을 살펴보겠습니다. 특히 한정자
+
, -
, ~
, ?
의 존재 여부를 처리해야 할 필요성이 있습니다.요약:
전체 기사를 읽고 싶지 않다면. 여기에 하이라이트를 두겠습니다.
(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}))
믹스에 예선 추가
이제 한정자를 처리해야 했습니다. 존재하거나 존재하지 않을 수 있습니다. 내가 끝낸 새로운 정규식:/^(?P<qualifier>[+?~-])?(?P<is_a>a)(?:[:])?(?P<a_mechanism>.+)?/gmi
이것을 조금 분석해 보겠습니다.
<올>
^
줄/문자열이 시작됩니다(?P<qualifier>[+?~-])?
. +
, ?
, ~
, -
가 존재합니다. 또는 캡처 자체는 ()?
가 ?
로 끝나므로 아무것도 찾을 수 없습니다. -
의 위치도 중요합니다. 목록의 마지막 항목이어야 합니다.(?P<is_a>a)
. a
문자가 있습니다. (예. 이 캡처는 이제 정말 중복됩니다.) (?:[:])?
:
문자가 있을 수 있습니다. 이는 비캡처 그룹으로 묶이므로 선택 사항으로 정의할 수 있습니다. (?P<a_mechanism>.+)?
. 존재하는 다른 텍스트를 캡처합니다. 다시 이 전체 캡처는 선택 사항입니다. 메커니즘은 완전한 레코드로 a
만 포함할 수 있습니다. 결과
^ 문자 없이
<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.au
는 Some("iler.com.au")
의 메커니즘과 일치합니다. 이 또한 올바르지 않습니다.
^ 문자 사용
<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 크레이트는 기본적으로 여러 줄입니다.
읽어주셔서 감사합니다.
Reference
이 문제에 관하여(Rust에서 Regex 살펴보기(부록)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/basman/looking-at-regex-in-rust-addendum-9j8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)