用于STL消息的正则表达式过滤器

时间:2010-10-04 15:41:56

标签: regex stl

鉴于以下STL错误:

./poly_power/poly_class.cpp:496: error: no matching function for call to ‘state_operator< polynomial< variable_term< polynomial< variable_term< std::basic_string<char, std::char_traits< char>, std::allocator< char> >, int> >, polynomial< variable_term<std::basic_string< char, std::char_traits< char>, std::allocator<char> >, int> > > >, polynomial<variable_term< polynomial< variable_term< std::basic_string< char, std::char_traits< char>, std::allocator< char> >, int> >, polynomial< variable_term< std::basic_string< char, std::char_traits< char>, std::allocator< char> >, int> > > > >::operation( std::pair< const std::basic_string< char, std::char_traits< char>, std::allocator< char> >, state_vector_term< polynomial< variable_term< polynomial< variable_term< std::basic_string< char, std::char_traits< char>, std::allocator< char> >, int> >, polynomial< variable_term< std::basic_string< char, std::char_traits< char>, std::allocator< char> >, int> > > >, polynomial< variable_term< polynomial< variable_term< std::basic_string< char, std::char_traits< char>, std::allocator< char> >, int> >, polynomial< variable_term< std::basic_string< char, std::char_traits< char>, std::allocator< char> >, int> > > > > >&)’

如何使用reg-ex表达式将其简化为:

./poly_power/poly_class.cpp:496: error: no matching function for call to ‘state_operator<...>::operation( std::pair<...>&)’

即。将外部<>对中的所有内容转换为...。我知道STLFilt,一个类似的perl脚本,但我认为看看如何在纯正则表达式中完成这一步将是教学法。

加成

对表达式进行Paraitimze,使其在<>的第n级上运行。第一级将是上面的示例,而第二级将显示类似state_operator<polynomial<...>, polynomial<...> >

1 个答案:

答案 0 :(得分:4)

这里有一个不规则的语法,几乎不可能与正则表达式匹配。

修改

我已经进行了一些实验,而且, 是可能的(假设尖括号出现在字符串中的其他地方,它们是平衡的(每个开口的一个右括号),并且您可以定义所涉及的嵌套的上限):

匹配<...>(不嵌套):

<[^<>]*+>

匹配<...<...>...<...>...>(一级嵌套):

<[^<>]*+(?:<[^<>]*+>[^<>]*+)*+[^<>]*+>

最多匹配两个嵌套级别:

<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+>[^<>]*+)*+>[^<>]*+)*+[^<>]*+>

最多三个级别:

<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+>[^<>]*+)*+>[^<>]*+)*+>[^<>]*+)*+[^<>]*+>

最多四个级别:

<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+>[^<>]*+)*+>[^<>]*+)*+>[^<>]*+)*+>[^<>]*+)*+[^<>]*+>

最多五个级别:

<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+(?:<[^<>]*+>[^<>]*+)*+>[^<>]*+)*+>[^<>]*+)*+>[^<>]*+)*+>[^<>]*+)*+[^<>]*+>

要获得奖励积分,这是最后一个分解为详细正则表达式,所以你可以看到它更容易构建:

<             # Match the first opening <
[^<>]*+       # Match any non-<>-characters possessively
  (?:         # Match the following zero or more times:
  <             # Match a <
  [^<>]*+       # etc. etc. etc.
    (?:
    <
    [^<>]*+
      (?:
      <
      [^<>]*+
        (?:
        <
        [^<>]*+
          (?:          # innermost level:
          <            # Match a <
          [^<>]*+      # Match any non-<> characters
          >            # Match a >
          [^<>]*+      # Match any non-<> characters
          )*+          # any number of times, possessively
        >            # then back one level: Match a >
        [^<>]*+      # etc. etc. etc.
        )*+
      >
      [^<>]*+
      )*+
    >
    [^<>]*+
    )*+
  >
  [^<>]*+
  )*+
[^<>]*+
>               # Match the final closing >

这不是非常可怕吗?

对于您的示例,您似乎需要七个级别的嵌套。如果你想要一个快速的正则表达式构造函数,它可能看起来像这样(在Python中):

def innerregex(nesting):
    if nesting == 0:
        return ""
    else:
        return "(?:<[^<>]*+" + innerregex(nesting-1) + ">[^<>]*+)*+"

def makeregex(nesting):
    return "<[^<>]*+" + innerregex(nesting) + ">"

makeregex(2)将返回正确匹配<<<><>>>的正则表达式。 makeregex(7)应该对整个字符串起作用,makeregex(6)只会进行最里面的匹配,依此类推。