본문으로 건너뛰기
토파즈6.0 · 출시 전
다운로드 →

문서 검색

명세 6.0

방향키로 결과를 고르고 Enter를 눌러 여세요.

API 이름, 진단 번호, 규칙 또는 프로젝트 주제를 입력하세요.

    라이브러리 · std.regex

    Regex.findAll

    Returns ordered nonoverlapping matches with scalar-boundary progress after empty matches.

    findAll(text: string) -> Array<Match>
    수신자
    Regex
    최소 인자 수
    1
    최대 인자 수
    1

    Declaration and parameters

    링크

    사용 조건

    기본 포함 · 미정

    Import std.regex in language mode 5.21.

    The current compiler selects std/regex.tpz for this language mode. Availability in other released editions and inclusion in each installed distribution are Pending.

    수신자

    Regex

    매개변수 제약

    Regex.isMatch reports whether a match exists anywhere in the input. Regex.find returns Some containing the first match or None() when no match exists. Regex.findAll returns every nonoverlapping match in search order and returns an empty array when no match exists.

    Search begins at the earliest Unicode scalar boundary that permits the complete pattern to match. At that position alternatives are tried in pattern order. Greedy repetitions prefer more scalars and lazy repetitions prefer fewer scalars while still allowing the rest of the pattern to match.

    After a nonempty match, findAll resumes at its exclusive end. After an empty match, it resumes at the next Unicode scalar boundary. An empty match directly at the end of the preceding nonempty match is skipped and search advances to the next scalar boundary.

    An empty pattern visits every scalar boundary, including both ends. The empty input has one boundary and produces one empty match for an empty pattern. Matching never splits the UTF-8 bytes of a scalar.

    Regex.split and Regex.replaceAll use the same ordered match sequence as findAll. Repeated calls start a new search and do not retain a cursor. The input string and compiled pattern are unchanged.

    The receiver is evaluated once before the positional arguments, which are evaluated once from left to right. Search does not invoke user callbacks or access external state. No match is an ordinary result and does not produce a diagnostic.

    Match.start and Match.end are read-only nonnegative UTF-8 byte offsets in the original input. They follow the inclusive start and exclusive end of byte intervals. Both are scalar boundaries and the end does not exceed the UTF-8 byte length of the input.

    Match.text is the matched substring. An empty match has equal start and end and an empty text value. The offsets are not string grapheme indexes. A match may select a combining mark inside a grapheme.

    Encoding the original input with encodeUtf8, slicing its bytes from start to end, and calling decodeUtf8 returns Ok containing Match.text. This relationship also holds for non-ASCII input.

    Match.groups returns an independent array indexed by capture number. Entry zero is Some containing the entire match. Capturing parentheses are numbered from one in opening-parenthesis order. Named groups participate in the same numbering and noncapturing groups do not.

    A nonparticipating capture has value None(). A participating empty capture has value Some containing an empty string. A repeated capture retains the last participating capture in the selected match.

    Match.named returns an independent map from capture names to captured strings. A nonparticipating named capture is absent. A participating empty named capture is present with an empty string. Names are inserted in ascending ASCII order.

    Reading a Match field evaluates its receiver once and does not modify the Match or input. Mutating a groups array or named map does not affect a later field read. Field access cannot fail for a Match value.

    결과

    The declared result type is Array<Match>.

    효과

    실패

    Result and effects

    링크

    Returns ordered nonoverlapping matches with scalar-boundary progress after empty matches.

    Resolved contracts

    링크

    Related entries

    링크

    std.regex →

    링크
    규칙topaz.stdlib.contract.regex-search.rule

    Search from the left and advance through nonoverlapping matches

    Regex.isMatch reports whether a match exists anywhere in the input. Regex.find returns Some containing the first match or None() when no match exists. Regex.findAll returns every nonoverlapping match in search order and returns an empty array when no match exists.

    Search begins at the earliest Unicode scalar boundary that permits the complete pattern to match. At that position alternatives are tried in pattern order. Greedy repetitions prefer more scalars and lazy repetitions prefer fewer scalars while still allowing the rest of the pattern to match.

    After a nonempty match, findAll resumes at its exclusive end. After an empty match, it resumes at the next Unicode scalar boundary. An empty match directly at the end of the preceding nonempty match is skipped and search advances to the next scalar boundary.

    An empty pattern visits every scalar boundary, including both ends. The empty input has one boundary and produces one empty match for an empty pattern. Matching never splits the UTF-8 bytes of a scalar.

    Regex.split and Regex.replaceAll use the same ordered match sequence as findAll. Repeated calls start a new search and do not retain a cursor. The input string and compiled pattern are unchanged.

    The receiver is evaluated once before the positional arguments, which are evaluated once from left to right. Search does not invoke user callbacks or access external state. No match is an ordinary result and does not produce a diagnostic.

    이유

    One ordered match sequence makes searching, splitting, and replacement agree. Advancing after an empty match ensures progress without splitting a Unicode scalar. Boolean search is distinct from extracting Match data and does not introduce regex membership through the in operator.

    Choose the first successful alternative at the leftmost position

    링크
    main.tpzChoose the first successful alternative at the leftmost position플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. match (Regex.compile("a|ab")) {
    4. case Ok(pattern) => {
    5. match (pattern.find("zab")) {
    6. case Some(found) => io.writeLine("{found.start}:{found.end}:{found.text}")
    7. case None() => io.writeLine("no match")
    8. }
    9. let present = pattern.isMatch("zab")
    10. let absent = pattern.isMatch("zzz")
    11. io.writeLine("{present}:{absent}")
    12. match (pattern.find("zzz")) {
    13. case None() => io.writeLine("none")
    14. case Some(_) => io.writeLine("present")
    15. }
    16. let matches = pattern.findAll("zzz")
    17. io.writeLine("{matches.length}")
    18. }
    19. case Err(_) => io.writeLine("compile failed")
    20. }
    기대 출력종료 코드 0
    1:2:a
    true:false
    none
    0
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. 1:2:a
    2. true:false
    3. none
    4. 0

    Choose a group alternative that allows the complete pattern to match

    링크
    main.tpzChoose a group alternative that allows the complete pattern to match플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. match (Regex.compile("(a|ab)c")) {
    4. case Ok(pattern) => {
    5. match (pattern.find("abc")) {
    6. case Some(found) => io.writeLine(found.text)
    7. case None() => io.writeLine("no match")
    8. }
    9. }
    10. case Err(_) => io.writeLine("compile failed")
    11. }
    기대 출력종료 코드 0
    abc
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. abc

    Return nonoverlapping matches in input order

    링크
    main.tpzReturn nonoverlapping matches in input order플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. match (Regex.compile("aa")) {
    4. case Ok(pattern) => {
    5. for found in (pattern.findAll("aaaaa")) {
    6. io.writeLine("{found.start}:{found.end}:{found.text}")
    7. }
    8. }
    9. case Err(_) => io.writeLine("compile failed")
    10. }
    기대 출력종료 코드 0
    0:2:aa
    2:4:aa
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. 0:2:aa
    2. 2:4:aa

    Visit each boundary for an empty pattern and the empty input

    링크
    main.tpzVisit each boundary for an empty pattern and the empty input플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. match (Regex.compile("")) {
    4. case Ok(pattern) => {
    5. for found in (pattern.findAll("ab")) {
    6. io.writeLine("{found.start}:{found.end}")
    7. }
    8. io.writeLine("empty input")
    9. for found in (pattern.findAll("")) {
    10. io.writeLine("{found.start}:{found.end}")
    11. }
    12. }
    13. case Err(_) => io.writeLine("compile failed")
    14. }
    기대 출력종료 코드 0
    0:0
    1:1
    2:2
    empty input
    0:0
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. 0:0
    2. 1:1
    3. 2:2
    4. empty input
    5. 0:0

    Skip an empty match directly after a nonempty match

    링크
    main.tpzSkip an empty match directly after a nonempty match플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. match (Regex.compile("a*")) {
    4. case Ok(pattern) => {
    5. for found in (pattern.findAll("ab")) {
    6. io.writeLine("{found.start}:{found.end}:{found.text}")
    7. }
    8. }
    9. case Err(_) => io.writeLine("compile failed")
    10. }
    기대 출력종료 코드 0
    0:1:a
    2:2:
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. 0:1:a
    2. 2:2:

    Return no match after scanning a longer valid input

    링크
    main.tpzReturn no match after scanning a longer valid input플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. let mut text = "a"
    4. for step in (0 .. 17) {
    5. text = text + text
    6. }
    7. match (Regex.compile("z")) {
    8. case Ok(pattern) => io.writeLine("{pattern.isMatch(text)}")
    9. case Err(_) => io.writeLine("compile failed")
    10. }
    기대 출력종료 코드 0
    false
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. false

    Read match boundaries and capture snapshots

    링크
    규칙topaz.stdlib.contract.regex-match.rule

    Read match boundaries and capture snapshots

    Match.start and Match.end are read-only nonnegative UTF-8 byte offsets in the original input. They follow the inclusive start and exclusive end of byte intervals. Both are scalar boundaries and the end does not exceed the UTF-8 byte length of the input.

    Match.text is the matched substring. An empty match has equal start and end and an empty text value. The offsets are not string grapheme indexes. A match may select a combining mark inside a grapheme.

    Encoding the original input with encodeUtf8, slicing its bytes from start to end, and calling decodeUtf8 returns Ok containing Match.text. This relationship also holds for non-ASCII input.

    Match.groups returns an independent array indexed by capture number. Entry zero is Some containing the entire match. Capturing parentheses are numbered from one in opening-parenthesis order. Named groups participate in the same numbering and noncapturing groups do not.

    A nonparticipating capture has value None(). A participating empty capture has value Some containing an empty string. A repeated capture retains the last participating capture in the selected match.

    Match.named returns an independent map from capture names to captured strings. A nonparticipating named capture is absent. A participating empty named capture is present with an empty string. Names are inserted in ascending ASCII order.

    Reading a Match field evaluates its receiver once and does not modify the Match or input. Mutating a groups array or named map does not affect a later field read. Field access cannot fail for a Match value.

    이유

    Byte offsets identify every exact match even when a pattern selects part of a grapheme. The byte-slice relationship makes those offsets usable without confusing them with text indexing. Optional numbered captures and omitted named entries distinguish absence from a captured empty string.

    Report UTF-8 byte offsets for non-ASCII matches

    링크
    main.tpzReport UTF-8 byte offsets for non-ASCII matches플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. function show(patternText: string, text: string) -> () {
    4. match (Regex.compile(patternText)) {
    5. case Ok(pattern) => {
    6. match (pattern.find(text)) {
    7. case Some(found) => io.writeLine("{found.start}:{found.end}:{found.text}")
    8. case None() => io.writeLine("no match")
    9. }
    10. }
    11. case Err(_) => io.writeLine("compile failed")
    12. }
    13. }
    14. show("한", "é한🙂")
    15. show("́", "éx")
    기대 출력종료 코드 0
    2:5:한
    1:3:́
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. 2:5:한
    2. 1:3:́

    Recover a match through the byte slice identified by its offsets

    링크
    main.tpzRecover a match through the byte slice identified by its offsets플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. let text = "한x"
    4. match (Regex.compile("한")) {
    5. case Ok(pattern) => {
    6. match (pattern.find(text)) {
    7. case Some(found) => {
    8. let bytes = text.encodeUtf8().slice(found.start, found.end)
    9. match (bytes.decodeUtf8()) {
    10. case Ok(decoded) => io.writeLine(decoded)
    11. case Err(_) => io.writeLine("invalid UTF-8 slice")
    12. }
    13. }
    14. case None() => io.writeLine("no match")
    15. }
    16. }
    17. case Err(_) => io.writeLine("compile failed")
    18. }
    기대 출력종료 코드 0
    한
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. 한

    Keep capture zero and distinguish missing and empty captures

    링크
    main.tpzKeep capture zero and distinguish missing and empty captures플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. match (Regex.compile("(?<word>a)(b)?()")) {
    4. case Ok(pattern) => {
    5. match (pattern.find("a")) {
    6. case Some(found) => {
    7. io.writeLine("{found.groups.length}")
    8. for group in (found.groups) {
    9. match (group) {
    10. case Some(text) => io.writeLine("some={text}")
    11. case None() => io.writeLine("none")
    12. }
    13. }
    14. }
    15. case None() => io.writeLine("no match")
    16. }
    17. }
    18. case Err(_) => io.writeLine("compile failed")
    19. }
    기대 출력종료 코드 0
    4
    some=a
    some=a
    none
    some=
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. 4
    2. some=a
    3. some=a
    4. none
    5. some=

    Omit absent named captures and retain a captured empty string

    링크
    main.tpzOmit absent named captures and retain a captured empty string플레이그라운드 열기 →
    1. import std.regex { Regex }
    2. import std.io
    3. match (Regex.compile("(?<z>a)?(?<a>b*)")) {
    4. case Ok(pattern) => {
    5. match (pattern.find("")) {
    6. case Some(found) => {
    7. let mut snapshot = found.named
    8. let hasOptional = snapshot.containsKey("z")
    9. io.writeLine("{hasOptional}")
    10. match (snapshot.get("a")) {
    11. case Some(text) => io.writeLine("some={text}")
    12. case None() => io.writeLine("none")
    13. }
    14. snapshot.insert("a", "changed")
    15. match (found.named.get("a")) {
    16. case Some(text) => io.writeLine("again={text}")
    17. case None() => io.writeLine("none")
    18. }
    19. }
    20. case None() => io.writeLine("no match")
    21. }
    22. }
    23. case Err(_) => io.writeLine("compile failed")
    24. }
    기대 출력종료 코드 0
    false
    some=
    again=
    
    $ topaz run main.tpz · 대상 제품 5.21.3
    기대 결과

    기대 결과

    실행을 마칩니다. 종료 코드 0.

    기대 표준 출력
    1. false
    2. some=
    3. again=

    메뉴

    다운로드 →