parse_literal/
parse_literal.rs

1#![expect(clippy::print_stdout)]
2//! # Regular Expression Literal Parsing Example
3//!
4//! This example demonstrates parsing regular expression literals with various
5//! patterns and flags to validate and analyze regex syntax.
6//!
7//! ## Usage
8//!
9//! ```bash
10//! cargo run -p oxc_regular_expression --example parse_literal
11//! ```
12
13use oxc_allocator::Allocator;
14use oxc_regular_expression::{LiteralParser, Options};
15
16/// Test various regular expression patterns and demonstrate parsing results
17fn main() {
18    let allocator = Allocator::default();
19
20    for (pattern_text, flags_text) in [
21        (r"ab", ""),
22        (r"abc", "i"),
23        (r"abcd", "igv"),
24        (r"emo👈🏻ji", "u"),
25        (r"ab|c", "i"),
26        (r"a|b+|c", "i"),
27        (r"a{0}|b{1,2}|c{3,}", "i"),
28        (r"(?=a)|(?<=b)|(?!c)|(?<!d)", "i"),
29        (r"\n\cM\0\x41\.", ""),
30        (r"\n\cM\0\x41\u1234\.", "u"),
31        (r"\n\cM\0\x41\u{1f600}\.", "u"),
32        (r"a\k<f>x\1c", "u"),
33        (r"(cg)(?<n>cg)(?:g)", ""),
34        (r"{3}", ""), // Error
35        (r"Em🥹j", ""),
36        (r"^(?=ab)\b(?!cd)(?<=ef)\B(?<!gh)$", ""),
37        (r"^(?<!ab)$", ""),
38        (r"a)", ""), // Error
39        (r"c]", ""),
40        (r"[abc]", ""),
41        (r"[|\]]", ""),
42        (r"[a&&b]", "v"),
43        (r"[a--b]", "v"),
44        (r"[a&&&]", "v"), // Error
45        (r"[a---]", "v"), // Error
46        (r"[^a--b--c]", "v"),
47        (r"[a[b[c[d[e[f[g[h[i[j[k[l]]]]]]]]]]]]", "v"),
48        (r"[\q{abc|d|e|}]", "v"),
49        (r"\p{Basic_Emoji}", "v"),
50        (r"\p{Basic_Emoji}", "u"), // Error
51        (r"[[^\q{}]]", "v"),       // Error
52        (r"(?<a>)(?<a>)", ""),     // Error
53        (r"(?noname)", "v"),       // Error
54        (r"[\bb]", ""),
55        (r"a{2,1}", "v"), // Error
56    ] {
57        let parser = LiteralParser::new(
58            &allocator,
59            pattern_text,
60            Some(flags_text),
61            // +1 for added `/` in error reports
62            Options { pattern_span_offset: 1, ..Options::default() },
63        );
64        let ret = parser.parse();
65
66        let literal = format!("/{pattern_text}/{flags_text}");
67        println!("Parse: {literal}");
68        match ret {
69            Ok(pattern) => {
70                println!("✨ {pattern:#?}");
71            }
72            Err(error) => {
73                let error = error.with_source_code(literal);
74                println!("💥 {error:?}");
75            }
76        }
77        println!();
78    }
79}