当前位置: 首页 > 面试题库 >

生成正则表达式的所有可能匹配项

东门新立
2023-03-14
问题内容

如何导出正则表达式的所有可能匹配项

例如:

(((a,b,c)o(m,v)p,b)

从上面的表达式生成的字符串将是:

o

庞然大物

补偿

aovp

bovp

冠状病毒

b


问题答案:

尽管执行这些步骤可能需要一些工作,但您的步骤非常简单:

  1. 创建一个递归函数,该函数提取所涉及的第一组括号之间的字符串:
  2. 在函数中,将此字符串分割','为avector<string>并返回
  3. 如果由于嵌套括号而需要进行递归,则在返回测试之前,对于递归函数返回的每种可能组合,必须在返回值中添加一个字符串

编辑:

说我的输入字符串是“(bl(ah,eck,le),yap)”

  • 第一个函数将提取string:“ bl(ah,eck,le),yap”
  • 返回之前,它将搜索嵌套的括号,这将导致其递归:
    • 第二个函数将提取string:“ ah,eck,le”
    • 返回之前,它将搜索嵌套的括号并没有找到
    • 它会返回一个vector<string>:[“ ah”,“ eck”,“ le”]
  • 现在,第一个函数将包含:“ bl [” ah“,” eck“,” le“],yap”
  • 它将不再找到要提取的括号,因此将扩展所有内部组合:“ [” blah“,” bleck“,” blle“],yap”
  • 现在可以拆分字符串并返回:[“ blah”,“ bleck”,“ blle”,“ yap”]

您第一个函数的回报就是您的结果。

编辑:

很高兴您解决了这个问题,我也写了一个两状态机来解决它,所以我想可以将其发布在这里供您比较:

const char* extractParenthesis(const char* start, const char* finish){
    int count = 0;

    return find_if(start, finish, [&](char i){
        if (i == '('){
            count++;
        }
        else if (i == ')'){
            count--;
        }
        return count <= 0; });
}

vector<string> split(const char* start, const char* finish){
    const char delimiters[] = ",(";
    const char* it;
    vector<string> result;

    do{
        for (it = find_first_of(start, finish, begin(delimiters), end(delimiters));
            it != finish && *it == '(';
            it = find_first_of(extractParenthesis(it, finish) + 1, finish, begin(delimiters), end(delimiters)));
        auto&& temp = interpolate(start, it);
        result.insert(result.end(), temp.begin(), temp.end());
        start = ++it;
    } while (it <= finish);
    return result;
}

vector<string> interpolate(const char* start, const char* finish){
    vector<string> result{ 1, string{ start, find(start, finish, '(') } };

    for (auto it = start + result[0].size();
        it != finish;
        it = find(++start, finish, '('),
        for_each(result.begin(), result.end(), [&](string& i){ i += string{ start, it }; })){
        start = extractParenthesis(it, finish);

        auto temp = split(next(it), start);
        const auto size = result.size();

        result.resize(size * temp.size());

        for (int i = result.size() - 1; i >= 0; --i){
            result[i] = result[i % size] + temp[i / size];
        }
    }
    return result;
}

由于它们相互调用,因此需要根据您的编译器进行转发声明。如果输入字符串格式错误,这也将导致崩溃。而且它不能处理转义的控制字符。

无论如何,您可以这样称呼它:

const char test[] = "((a,b,c)o(m,v)p,b)";
auto foo = interpolate(begin(test), end(test));

for (auto& i : foo){
    cout << i << endl;
}


 类似资料:
  • 问题内容: 从那时起,我一直在TutorialsPoint上查看代码,此后一直困扰着我……看一下这段代码: 此代码成功打印: 但是根据正则表达式,为什么它不返回其他可能的结果,例如: 要么 如果此代码不适合这样做,那么我该如何编写一个可以找到所有可能匹配项的代码? 问题答案: 这是因为的贪婪,随之而来的是回溯。 字串: 正则表达式: 我们都知道那是贪婪的,并且尽可能匹配所有字符。因此,第一个匹配所

  • 当所有组都是可选的时,我在提取组时遇到了问题。 上下文(如果您愿意,可以跳到结尾):这是在将字符串与一堆正则表达式进行最佳匹配并查看哪个表达式具有最多组匹配的上下文中。 例如,我可能有一个潜在的格式; 但我希望用户打错字,或者不包含空格或其他东西。 所以我可以用绳子测试一下 并希望获得组 一个 光盘 1-1 G 而且,对于测试字符串 我想得到   DE   克 下面是我的正则表达式,用于匹配以下可

  • 问题内容: 是的,您没看错。我需要能够从正则表达式 生成 随机文本的内容。因此,文本应该是随机的,但要与正则表达式匹配。看来它不存在,但我可能是错的。 仅举一个例子:该库将能够以“ ”作为输入,并生成诸如以下示例: abc abbbc bac 等等 更新:我自己创建了一些东西:Xeger。查看http://code.google.com/p/xeger/。 问题答案: 我刚刚创建了一个库来进行此操

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 问题内容: 我知道通过使用Xeger,我们可以获得指定模式的随机值。 我想知道是否有一种方法可以返回指定正则表达式的所有有效字符串。例如,对于模式:,我们可以得到所有的值来。 谢谢 编辑: 在这里,我们不考虑+和*等无限输出;我们如何获得有限正则表达式的所有值? 最后编辑: 感谢大家!最后,我不会考虑所有可能的值,因为可能有数千个。我限制一个特定的数字作为减少数量的值的数量。 问题答案: 由于正则

  • 我们得到了一些这样的内容:

  • 问题内容: 我正在尝试使用python及其正则表达式查找所有可能的单词/标记对或其他嵌套组合。 寻找: 我认为正则表达式公式也可以找到嵌套的括号单词/标记对,但它不会返回它们。我应该怎么做? 问题答案: 实际上,不可能使用正则表达式来做到这一点,因为正则表达式表达了一种由 正则 语法定义的语言,该语言可以通过非限定性自动机来解决,其中匹配由状态表示;然后要匹配嵌套的括号,您需要能够匹配无限数量的括

  • 我试图用python及其正则表达式找到所有可能的单词/标记对或其他嵌套组合。 寻找: 我认为正则表达式也可以找到嵌套的括号单词/标记对,但它不返回它们。我该怎么做?