代码之家  ›  专栏  ›  技术社区  ›  Hooked

STL消息的Regex筛选器

  •  1
  • Hooked  · 技术社区  · 15 年前

    给定以下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> > > > > >&)’
    

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

    也就是说,转换外部对中的所有内容 <> 进入之内 ... . 我知道STLFilt,这是一个perl脚本,它做了类似的事情,但我认为看看如何在纯regex中实现这一点会很有启发性。

    对表达式进行仿真,使其在 <> . 第一级是上面的例子,而第二级是类似的 state_operator<polynomial<...>, polynomial<...> >

    1 回复  |  直到 15 年前
        1
  •  4
  •   Tim Pietzcker    15 年前

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

    编辑:

    可能(前提是尖括号出现在字符串中的其他位置,并且它们是平衡的(每个左括号对应一个右括号),并且您可以为所涉及的嵌套定义一个上限):

    匹配 <...>

    <[^<>]*+>
    

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

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

    最多可匹配两个级别的嵌套:

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

    最多三个级别:

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

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

    最多五个级别:

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

    等。

    <             # 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 >
    

    这不是很可怕吗?

    例如,似乎需要七个层次的嵌套。如果您想要一个快速的regex构造函数,它可以如下所示(在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) 只取最里面的火柴,以此类推。