正则表达式匹配字符串从偏移量开始

Jas*_*onN 4 regex rust

我正在学习Rust并试图立即编写一个简单的标记器.我想通过一个字符串来运行每个正则表达式对着字符串中的当前位置,创建一个标记,然后向前跳过并重复,直到我处理完整个字符串.我知道我可以将它们放入更大的正则表达式并循环捕获,但我需要单独处理它们以进行域解析.

但是,我在正则表达式框中看不到允许偏移,所以我可以在特定点再次开始匹配.

extern crate regex;
use regex::Regex;

fn main() {

    let input = "3 + foo/4";

    let ident_re = Regex::new("[a-zA-Z][a-zA-Z0-9]*").unwrap();
    let number_re = Regex::new("[1-9][0-9]*").unwrap();
    let ops_re = Regex::new(r"[+-*/]").unwrap();
    let ws_re = Regex::new(r"[ \t\n\r]*").unwrap();

    let mut i: usize = 0;

    while i < input.len() {

        // Here check each regex to see if a match starting at input[i]
        // if so copy the match and increment i by length of match.
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的那些正则表达式实际上也会在运行时变化.有时候我可能只会寻找其中的一些,而其他人(在顶级)我可能会寻找几乎所有这些.

oli*_*obk 6

正则表达式包适用于字符串切片.您始终可以获取另一个切片的子切片,然后对该切片进行操作.您可以修改指向切片的变量以指向您的子切片,而不是沿索引移动.

fn main() {
    let mut s = "hello";
    while !s.is_empty() {
        println!("{}", s);
        s = &s[1..];
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,切片操作在字节位置切片,而不是utf8-char-positions.这允许切片操作在O(1)而不是O(n)中完成,但如果正在切换的索引恰好位于多字节utf8字符的中间,也会导致程序发生混乱. .

  • 是的,它确实.切片使用字节位置.这就是没有索引操作的原因."我是按字符索引还是按字节索引?" 问题太混乱了.请注意,按字符索引将需要O(n)操作,其中按字节索引需要O(1) (3认同)
  • 从`String`转换为`str`是一个无操作,从`str`转换为`String`是一个堆分配,但我看不到`str` - >`String`转换的位置应该在你的代码中发生 (2认同)
  • 你错误地阅读了正在发生的事情.它是`&(s [1 ..])`.我们将字符串(不是索引)从位置1切割到字符串的末尾.然后参考该切片 (2认同)