繁体   English   中英

Visual C ++ std :: regex_search错误?

[英]Visual C++ std::regex_search bug?

我的弦看起来像这样

macd_at([{1036}].CLOSE,10,10,10).UPPER 

在此字符串中,我试图匹配此正则表达式

([a-zA-Z][a-zA-Z0-9_]*_(at|AT)\((((\[\{[0-9]+\}\](\.(OPEN|CLOSE|LOW|HIGH))?)|[1-9][0-9]*\.?[0-9]*|(TRUE|FALSE)|\"[^"]*\"),)*((\[\{[0-9]+\}\](\.(OPEN|CLOSE|LOW|HIGH))?)|[1-9][0-9]*\.?[0-9]*|(TRUE|FALSE)|\"[^"]*\")\)(\.(VALUE|UPPER|LOWER|PRICE))?)

在检查正则表达式的在线站点中,这是匹配的,但是当我调用std :: regex_search时,它不起作用。 VS C ++库中有一些错误吗?

当我改变字符串

macd_at([{1036}],10,10,10).UPPER 

std :: regex_search正在运行。 正则表达式的复杂程度是否有一定限制?

PS:正则表达式的构建过程如下(为了更容易查看正则表达式):

const std::string NUMBER_REGEX_PATERN = "[1-9][0-9]*\\.?[0-9]*";
const std::string OPERATOR_REGEX_PATERN = "(\\*|/|-|\\+)";
const std::string SYMBOL_REGEX_PATERN = "\\[\\{[0-9]+\\}\\]";
const std::string SYMBOL_SUFFIX_REGEX_PATERN = "(\\.(OPEN|CLOSE|LOW|HIGH))";
const std::string SYMBOL_WHOLE_REGEX_PATERN = "(" + SYMBOL_REGEX_PATERN + SYMBOL_SUFFIX_REGEX_PATERN + "?)";
const std::string STRING_REGEX_PATERN = "\\\"[^\"]*\\\"";
const std::string BOOLIAN_REGEX_PATERN = "(TRUE|FALSE)";
const std::string LITERAL_REGEX_PATERN = "(" + SYMBOL_WHOLE_REGEX_PATERN + "|" + NUMBER_REGEX_PATERN + "|" + BOOLIAN_REGEX_PATERN +"|" + STRING_REGEX_PATERN + ")";

const std::string STUDY_NAME_REGEX_PATERN = "[a-zA-Z][a-zA-Z0-9_]*_(at|AT)";
const std::string STUDY_SUFFIX_REGEX_PATERN = "(\\.(VALUE|UPPER|LOWER|PRICE))";
const std::string WHOLE_STUDY_REGEX_PATERN = STUDY_NAME_REGEX_PATERN + "\\((" +LITERAL_REGEX_PATERN + ",)*"+ LITERAL_REGEX_PATERN + "\\)";
const std::string WHOLE_STUDY_WITH_SUFIX_REGEX_PATERN = "(" + WHOLE_STUDY_REGEX_PATERN + STUDY_SUFFIX_REGEX_PATERN + "?)";

看到模式的复杂性,过度回溯可能是一个问题。 您可以倒数第二个构建块是可以大大减少回溯的一个方面。 尝试改变

...(" +LITERAL_REGEX_PATERN + ",)*"+ LITERAL_REGEX_PATERN...

进入

...LITERAL_REGEX_PATERN + "(" +LITERAL_REGEX_PATERN + ",)*"...

这是展开循环技术的简化形式,大大减少了回溯量。 请注意,两个模式都完全匹配相同的字符串。

优化的另一点是:

如果您不需要所有捕获组(并且我怀疑您需要它们,因为其中的一些在重复操作中会被覆盖),请将它们变成非捕获组。 例如

(?:\\.(?:OPEN|CLOSE|LOW|HIGH))

特别是与回溯结合使用时,不必要的捕获会变得非常昂贵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM