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

时间:2019-09-05 11:12:46

标签: c++ regex

我想查看序列是否(有条件地)被某些东西包围。

示例1-cat,且蜂鸣选项由方括号包围。

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

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

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

相反,我的目标是在?\\[表达式上以某种方式反映\\](一种或零种占用)的行为。

那么,有没有一种方法可以将两个(或多个)表达式视为一个单元,并在一个正则表达式中进行反思?


因此,对于情况2,我想检查浮点数。这是类似的情况:

由至少1个数字包围的.

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

在这种情况下,我想在两位数部分反映+(至少一种占用)的行为。但是我不知道如何解决,而我目前知道的唯一解决办法似乎并不是最优的:

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

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

3 个答案:

答案 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)重复整个模式。

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

答案 2 :(得分:0)

另一种尝试使用环视检查长度,以避免不必要的匹配。

status_value

演示:https://regex101.com/r/VMgKL5/3

相关问题