鉴于以下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<...> >
。
答案 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)
只会进行最里面的匹配,依此类推。