9个版本

0.3.0 2024年3月20日
0.2.2 2023年5月23日
0.2.1 2021年3月5日
0.2.0 2020年11月26日
0.1.4 2020年7月22日

#178 in 文本处理

Download history 1608/week @ 2024-04-03 2212/week @ 2024-04-10 2288/week @ 2024-04-17 2148/week @ 2024-04-24 2127/week @ 2024-05-01 1990/week @ 2024-05-08 2084/week @ 2024-05-15 2777/week @ 2024-05-22 1998/week @ 2024-05-29 2367/week @ 2024-06-05 2516/week @ 2024-06-12 2550/week @ 2024-06-19 2081/week @ 2024-06-26 2256/week @ 2024-07-03 2163/week @ 2024-07-10 1960/week @ 2024-07-17

8,936 每月下载量
用于 lang_tester

Apache-2.0/MIT

42KB
899

fm

fm是一个简单的非回溯模糊文本匹配器,用于匹配多行模式和文本。在最基本的情况下,通配符运算符 ...(默认)可以按以下方式使用:

  • 如果一行仅由 ... 组成,它表示“匹配零或更多行文本”。
  • 如果一行以 ... 开头,则搜索不锚定到行的开头。
  • 如果一行以 ... 结尾,则搜索不锚定到行的结尾。

请注意,... 可以出现在行的开头和结尾,如果一行由 ......(即以通配符开头和结尾,中间没有其他内容)组成,则它将匹配 exactly 一行。如果通配符运算符出现在任何其他位置,它将被字面匹配。通配符匹配不回溯,因此如果一行仅由 ... 组成,则下一个匹配行将锚定搜索的剩余部分。

以下示例展示了使用默认设置时 fm 的操作:

use fm::FMatcher;

assert!(FMatcher::new("a").unwrap().matches("a").is_ok());
assert!(FMatcher::new(" a ").unwrap().matches("a").is_ok());
assert!(FMatcher::new("a").unwrap().matches("b").is_err());
assert!(FMatcher::new("a\n...\nb").unwrap().matches("a\na\nb").is_ok());
assert!(FMatcher::new("a\n...\nb").unwrap().matches("a\na\nb\nb").is_err());

如果匹配失败,匹配器返回一个错误,指示匹配失败的行号。可以使用提供的 Display 实现对错误进行格式化,以便人类理解。

如果您想使用非默认选项,首先需要使用 FMBuilder,然后再访问 FMatcher。例如,要使用“名称匹配”(指定相同的文本块必须在文本的多个位置出现,但无需指定该块必须包含的内容),可以设置如下选项

use {fm::FMBuilder, regex::Regex};

let ptn_re = Regex::new(r"\$.+?\b").unwrap();
let text_re = Regex::new(r".+?\b").unwrap();
let matcher = FMBuilder::new("$1 $1")
                        .unwrap()
                        .name_matcher(ptn_re, text_re)
                        .build()
                        .unwrap();
assert!(matcher.matches("a a").is_ok());
assert!(matcher.matches("a b").is_err());

依赖项

~2.2–3MB
~53K SLoC