我想看看一个序列是否(有条件地)被某物包围。
示例案例 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/