我试图匹配重复相同次数的字符串,比如
abc123
abcabc123123
abcabcabc123123123
etc.也就是说,我希望第二组(123)与第一组(abc)匹配相同的次数。有点像
(abc)+(123){COUNT THE PREVIOUS GROUP MATCHED}这是使用锈菌箱https://docs.rs/regex/1.4.2/regex/
正如我担心的那样,编辑了,并通过回答和评论指出,这是不可能在regex中表示的,至少在没有某种递归的情况下是不可能的,这是Rust regex暂时不支持的。在这种情况下,我知道输入长度是有限的,我只是生成了如下规则
(abc123)|(abcabc123123)|(abcabcabc123123123)可怕的丑陋,但完成了工作,因为这不是“严肃”的代码,只是一个有趣的练习。
发布于 2020-12-19 18:04:36
正如其他人所评论的那样,我认为不可能在一个正则表达式中实现这一点。如果不能保证字符串的格式良好,则必须使用正则表达式验证它们,捕获每个组,然后比较组长度以验证它们是否具有相同的重复。但是,如果保证所有字符串都是格式良好的,那么甚至不需要使用regex来实现此检查:
fn matching_reps(string: &str, group1: &str, group2: &str) -> bool {
let group2_start = string.find(group2).unwrap();
let group1_reps = (string.len() - group2_start) / group1.len();
let group2_reps = group2_start / group2.len();
group1_reps == group2_reps
}
fn main() {
assert_eq!(matching_reps("abc123", "abc", "123"), true);
assert_eq!(matching_reps("abcabc123", "abc", "123"), false);
assert_eq!(matching_reps("abcabc123123", "abc", "123"), true);
assert_eq!(matching_reps("abcabc123123123", "abc", "123"), false);
}发布于 2020-12-19 17:56:39
纯正则表达式不能表示这一点。
可能有一些方法来定义back引用,但我不熟悉Rust中的regexp语法,从技术上讲,这将不仅仅是一个纯正则表达式。
然而,有一种简单的方法可以计算它:
^((abc)*)((123)*)$发布于 2020-12-19 23:14:36
动态构建模式也是一种选择。匹配一个、两个或三个嵌套的abc和123是可能的
abc(?:abc(?:abc(?:)?123)?123)?123见证明。(?:)?是多余的,它不匹配文本,(?:...)?匹配一个可选的模式。
let a = "abc"; // Prefix
let b = "123"; // Suffix
let level = 3; // Recursion (repetition) level
let mut result = "".to_string();
for _n in 0..level {
result = format!("{}(?:{})?{}", a, result, b);
}
println!("{}", result);
// abc(?:abc(?:abc(?:)?123)?123)?123https://stackoverflow.com/questions/65372679
复制相似问题