首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配与前一组相同的重复次数。

匹配与前一组相同的重复次数。
EN

Stack Overflow用户
提问于 2020-12-19 17:40:07
回答 4查看 505关注 0票数 2

我试图匹配重复相同次数的字符串,比如

代码语言:javascript
运行
复制
abc123
abcabc123123
abcabcabc123123123
etc.

也就是说,我希望第二组(123)与第一组(abc)匹配相同的次数。有点像

代码语言:javascript
运行
复制
(abc)+(123){COUNT THE PREVIOUS GROUP MATCHED}

这是使用锈菌箱https://docs.rs/regex/1.4.2/regex/

正如我担心的那样,编辑了,并通过回答和评论指出,这是不可能在regex中表示的,至少在没有某种递归的情况下是不可能的,这是Rust regex暂时不支持的。在这种情况下,我知道输入长度是有限的,我只是生成了如下规则

代码语言:javascript
运行
复制
(abc123)|(abcabc123123)|(abcabcabc123123123)

可怕的丑陋,但完成了工作,因为这不是“严肃”的代码,只是一个有趣的练习。

EN

回答 4

Stack Overflow用户

发布于 2020-12-19 18:04:36

正如其他人所评论的那样,我认为不可能在一个正则表达式中实现这一点。如果不能保证字符串的格式良好,则必须使用正则表达式验证它们,捕获每个组,然后比较组长度以验证它们是否具有相同的重复。但是,如果保证所有字符串都是格式良好的,那么甚至不需要使用regex来实现此检查:

代码语言:javascript
运行
复制
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);
}

游乐场

票数 2
EN

Stack Overflow用户

发布于 2020-12-19 17:56:39

纯正则表达式不能表示这一点。

可能有一些方法来定义back引用,但我不熟悉Rust中的regexp语法,从技术上讲,这将不仅仅是一个纯正则表达式。

然而,有一种简单的方法可以计算它:

  • 使用regexp确保您的字符串是^((abc)*)((123)*)$
  • 如果字符串匹配,则取两个捕获的子字符串,并比较它们的长度。
票数 1
EN

Stack Overflow用户

发布于 2020-12-19 23:14:36

动态构建模式也是一种选择。匹配一个、两个或三个嵌套的abc123是可能的

代码语言:javascript
运行
复制
abc(?:abc(?:abc(?:)?123)?123)?123

证明(?:)?是多余的,它不匹配文本,(?:...)?匹配一个可选的模式。

锈斑

代码语言:javascript
运行
复制
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)?123
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65372679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档