c++ - 有没有办法在 C++ 正则表达式中重用模式的一部分?

标签 c++ regex

我想看看一个序列是否(有条件地)被某物包围。

示例案例 1 - cat可以选择用方括号括起来。

[cat] // -> matches
cat   // -> matches

\\[?cat\\]?似乎是正则表达式的解决方案,但是它也与 [cat 不匹配和 cat] !

我可以使用 cat|\\[cat\\]分别对待这两种情况。但我只需要写下表达式 cat两次。

相反,我的目标是以某种方式反射(reflect) ? \\[ 上的(一次或零次)行为和 \\]表达式。

那么有没有一种方法可以将两个(或更多)表达式视为一个单元并在一个正则表达式中反射(reflect)所有内容?


假设情况 2 我想检查 float 。这是一个类似的情况:

一个.被至少 1 个数字包围。

1.5 // -> matches
.0  // -> matches
1.  // -> matches
50. // -> matches
2   // -> doesn't match
.   // -> doesn't match

在这种情况下,我想反射(reflect) + (至少一次)两位数部分的行为。但我不知道如何以及我目前知道的唯一方法来解决这个问题似乎并不是最佳的:

  • 将正则表达式拆分为 OR 部分
  • 两次正则表达式运行(首先检查表达式是否为单个点)
  • 捕获并计算匹配字符数。 ( std::smatch )

我真的不想这样做,因为在我的真实世界程序中,我当前的字符串非常复杂,包含在模式本身内遵循这些模式的子表达式。如果有办法用一个正则表达式解决这个问题,我就可以避免代码的巨大困惑。

最佳答案

要在使用 boost::regex 时在 C++ 中重复一个模式,可以使用 regex subroutines :捕获您需要重复的模式并使用 (?n),其中 n 是捕获组 ID。使用 (?R) 重复整个模式。

Example :

std::string s{"This is a cat"};
boost::smatch what;
boost::regex expr{R"~(\[(cat)\]|(?1))~"};
if (boost::regex_search(s, what, expr))
{
  std::cout << what[0] << '\n';
}

std::regex 不允许这样做。您需要动态构建模式:

std::string s{"This is a cat"};
std::string block{"cat"};
std::smatch what;
std::regex expr{"\\[" + block + "\\]|" + block};
if (std::regex_search(s, what, expr))
{
  std::cout << what[0] << '\n';
}

参见 this C++ demo .

关于c++ - 有没有办法在 C++ 正则表达式中重用模式的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57804225/

相关文章:

c++ - C++将指向成员的指针作为模板参数传递

c++ - 如果条件,代码不正确执行代码

c++ - Makefile:编译 src 和测试目录时出错

java - 如何使 Java String 贪婪地拆分为 lookahead?

python - 具有两种可能正则表达式的子字符串

java - Android的replaceAll()从字符串中删除错误的字符

c++ - 使用相同的着色器但不具有相同的纹理或颜色绘制多个 VAO 的最佳方法是什么

c++ - 数组和值的模板声明

regex - 谷歌分析正则表达式 - 替代无负面前瞻

regex - 使用正则表达式查找和替换字符串中模式的所有实例