我想查看序列是否(有条件地)被某些东西包围。
示例1-cat
,且蜂鸣选项由方括号包围。
[cat] // -> matches
cat // -> matches
\\[?cat\\]?
似乎是正则表达式解决方案,但是它也与[cat
和cat]
匹配!
我可以使用cat|\\[cat\\]
分别对待这两种情况。但是我只需要写两次表达式cat
。
相反,我的目标是在?
和\\[
表达式上以某种方式反映\\]
(一种或零种占用)的行为。
那么,有没有一种方法可以将两个(或多个)表达式视为一个单元,并在一个正则表达式中进行反思?
因此,对于情况2,我想检查浮点数。这是类似的情况:
由至少1个数字包围的.
。
1.5 // -> matches
.0 // -> matches
1. // -> matches
50. // -> matches
2 // -> doesn't match
. // -> doesn't match
在这种情况下,我想在两位数部分反映+
(至少一种占用)的行为。但是我不知道如何解决,而我目前知道的唯一解决办法似乎并不是最优的:
std::smatch
)我真的不想这样做,因为在我的真实程序中,我当前的字符串非常复杂,其中包含在模式本身内遵循这些模式的子表达式。如果有办法用一个正则表达式来解决这个问题,我就可以避免大量的代码混乱。
答案 0 :(得分:1)
正则表达式的问题是它们还没有完全解决,因此您必须努力从他们那里获得类似的聪明东西。
针对您:
由至少一个数字包围的
function_obj = some_function(s) print 'type:', type(function_obj) type: <type 'function'>
。
首先搜索:
.
针对所有不匹配项提出错误,然后搜索否定项:
[0-9]*\.[0-9]*
并在匹配的情况下引发错误。
答案 1 :(得分:1)
要在使用boost::regex
时在C ++中重复一个模式,可以使用regex subroutines:捕获需要重复的模式并使用(?n)
,其中n
是捕获组ID。使用(?R)
重复整个模式。
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。
答案 2 :(得分:0)