CodeSampleX

샘플

regex 1.13.1: Extract named capture groups with the regex crate, which has no backtracking

검증된 샘플 — cargo regex 1.13.1: Extract named capture groups with the regex crate, which has no backtracking. rust 1 · linux alpine/x64 · docker에서 contract를 실행해…

sha256:ec8b1f9f99e017e0f94308dd51bc6aa26dd89955a9aaf0b41eb0f11c6a136116

이 네트워크가 제공하는 것은 하나입니다. 빌드되는 샘플. 샌드박스에서 돌리고 서명된 영수증을 보관합니다. 등급을 매기지 않고 무엇도 보증하지 않습니다 — 같은 코드가 당신 환경에서 빌드되는지는 측정한 적이 없습니다. 통과한 계약 영수증을 낸 서로 다른 서명 키의 수입니다. 하나면 작성자 혼자이고, 둘 이상이면 다른 사람도 빌드했다는 뜻입니다. 키는 스스로 만드는 것이고 뒤에 등록된 신원이 없으므로, 세는 것은 사람이 아니라 키입니다. MIT-0

실행 증거

선언된 환경과 서명된 실행을 분리해 두었습니다. 이 샘플이 무엇을 어디서 실행했는지 그대로 볼 수 있습니다.

증거 기준
서명된 컨트랙트 통과
검증 영수증
3
빌드한 서명 키
3
선언된 환경 rust 1 linux x64 rust 1 rust cargo

검증 실행 환경

환경 컨트랙트 단계 실행일
rust 1 · linux alpine/x64 · docker ed25519:a2ec939a4c60e243 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · cargo@1
2026-08-13
rust 1 · linux alpine/x64 · docker ed25519:d91480838ac982c9 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · cargo@1
2026-08-17
rust 1 · linux alpine/x64 · docker ed25519:c1973797be207ac4 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · cargo@1rust:1-alpine@sha256:a10e64dd139b…
2026-09-08

케이스

HOW
목표
Extract named capture groups with the regex crate, which has no backtracking
패키지
심벌
  • Regex::new
  • captures
  • name
환경
rust 1
생성일
2026-08-13T18:44:58Z

컨트랙트

  1. compile a pattern with named groups and extract them
  2. assert a greedy name group splits on the LAST @, so scoped names parse
  3. assert a non-matching input yields None rather than an error
  4. assert backreferences and lookaround are rejected at compile time

파일

  • Cargo.lock
  • Cargo.toml
  • csx.json
  • src/main.rs

소스 아티팩트 내려받기 (tar.gz)

소스

Cargo.lock
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4

[[package]]
name = "aho-corasick"
version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
dependencies = [
 "memchr",
]

[[package]]
name = "csx-sample-regex"
version = "1.0.0"
dependencies = [
 "regex",
]

[[package]]
name = "memchr"
version = "2.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"

[[package]]
name = "regex"
version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
dependencies = [
 "aho-corasick",
 "memchr",
 "regex-automata",
 "regex-syntax",
]

[[package]]
name = "regex-automata"
version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
dependencies = [
 "aho-corasick",
 "memchr",
 "regex-syntax",
]

[[package]]
name = "regex-syntax"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
Cargo.toml
[package]
name = "csx-sample-regex"
version = "1.0.0"
edition = "2021"
license = "MIT-0"

[dependencies]
regex = "1.13.1"
csx.json
{"case":{"caseId":"case:sha256:60cda02700b4c544bcc5cf94d290e182bb0cca8b6285ceced916b43ad3418ee0","constraints":{"runtime":"rust"},"contract":["compile a pattern with named groups and extract them","assert a greedy name group splits on the LAST @, so scoped names parse","assert a non-matching input yields None rather than an error","assert backreferences and lookaround are rejected at compile time"],"goal":"Extract named capture groups with the regex crate, which has no backtracking","kind":"HOW","packages":["pkg:cargo/regex@1.13.1"],"schemaVersion":1,"symbols":["Regex::new","captures","name"]},"contractCommand":["cargo","run","--offline","--quiet"],"environment":{"arch":"x64","ecosystem":"cargo","executionContext":"rust","language":"rust","os":"linux","packageManager":"cargo","runtime":"rust","runtimeVersion":"1","schemaVersion":1},"license":"MIT-0","packages":["pkg:cargo/regex@1.13.1"],"schemaVersion":1,"symbols":["Regex::new","captures","name"],"verifierAdapter":"cargo@1"}
src/main.rs
use regex::Regex;

/// The regex crate guarantees linear time, and pays for it by refusing
/// backreferences and lookaround entirely — patterns copied from PCRE,
/// Python or JavaScript fail at COMPILE time with an error, they do not
/// silently misbehave. That trade is why untrusted patterns are safe here:
/// there is no catastrophic backtracking to trigger.
fn parse_purl(input: &str) -> Option<(String, String, String)> {
    // Greedy `.+` for the name and a version that cannot contain `@`: the
    // version separator is the LAST `@`, not the first. A lazy name or a
    // `[^@]+` name silently fails on scoped npm packages, whose names begin
    // with `@` — and fails by not matching at all, so the bug shows up as a
    // None rather than as a wrong split.
    let re = Regex::new(r"^pkg:(?<eco>[a-z]+)/(?<name>.+)@(?<version>[^@]+)$").unwrap();
    let caps = re.captures(input)?;
    Some((
        caps.name("eco")?.as_str().to_string(),
        caps.name("name")?.as_str().to_string(),
        caps.name("version")?.as_str().to_string(),
    ))
}

fn main() {
    let (eco, name, version) = parse_purl("pkg:npm/axios@1.19.0").expect("parses");
    assert_eq!(eco, "npm");
    assert_eq!(name, "axios");
    assert_eq!(version, "1.19.0");

    // Scoped npm names contain a slash and still parse.
    let (_, name, _) = parse_purl("pkg:npm/@scope/pkg@2.0.0").expect("scoped parses");
    assert_eq!(name, "@scope/pkg");

    // A non-match is None, not an error and not a panic.
    assert!(parse_purl("not-a-purl").is_none());

    // Backreferences and lookaround are refused at compile time.
    assert!(Regex::new(r"(a)\1").is_err(), "backreference must not compile");
    assert!(Regex::new(r"foo(?=bar)").is_err(), "lookahead must not compile");

    // find_iter walks every match.
    let words = Regex::new(r"[a-z]+").unwrap();
    let found: Vec<&str> = words.find_iter("one two three").map(|m| m.as_str()).collect();
    assert_eq!(found, vec!["one", "two", "three"]);

    println!("CONTRACT PASS: regex captured named groups and rejected backtracking syntax");
}

오리진 시더

anonymous