我正在试图弄清楚c ++中的正则表达式是如何运作的,所以我做了这个例子,我尝试了不同的正则表达式,看看它们是否匹配:
# Colour set up
class colours:
warning = '\033[93m'
colour1 = '\033[94m'
colour2 = '\033[1m'
terminate = '\033[0m'
# Logger set up
class Logger(object):
def __init__(self):
self.terminal = sys.stdout
self.log = open(“output.log”, "a")
def write(self, message):
self.terminal.write(message)
self.log.write(message)
sys.stdout = Logger()
# Example
print colours.warning + ‘WARNING!’ + colours.terminate
*in colour*:$ WARNING!
*in output.log*: [93mWARNING!
结果如下:
#include <regex>
int main(){
while (true) {
string needle;
cin >> needle;
regex regexp(needle);
std::smatch smatch;
string haystack = "caps.caps[0].MainFormat[0].Video.BitRateOptions = 896, 1536";
bool match = regex_search(haystack, smatch, regexp);
if (match) {
cout << "Matched" << endl;
}
else {
cout << "Mismatch" << endl;
}
}
}
为什么caps.caps[0].MainFormat[0].Video.BitRateOptions
Mismatch
(caps.caps[0].MainFormat[0].Video.BitRateOptions)
Mismatch
caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions
Matched
(caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions)
Matched
caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions=
Mismatch
(caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions=)
Mismatch
caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions =
Matched
Matched
(caps\.caps\[0\]\.MainFormat\[0\]\.Video\.BitRateOptions =)
THIS ONE BREAK THE PROCESS AND ENDS
caps.caps\[0]
THIS ONE BREAK THE PROCESS AND ENDS
会返回两个匹配项,为什么捕获此正则表达式会导致代码崩溃?基于此,我假设当我想匹配'['或']'时,我需要逃避它,也许还有一些其他情况,错误构造的regexp可能会使进程崩溃。是否有任何选项可以处理未转义的'['或']'和其他错误的正则表达式,因此代码不会崩溃而是不匹配?我在Windows 10上使用Visual Studio 2017.谢谢
答案 0 :(得分:2)
第一个
大写字母\ .caps \ [0 \] \ .MainFormat \ [0 \] \ .Video \ .BitRateOptions =
返回两个匹配项,因为std::cin >> needle;
只读取直到找到第一个空格字符(第一个匹配项)。然后它会读取下一个“单词”=
,它会给出第二个匹配。
下一个
会发生类似的行为(caps \ .caps \ [0 \] \ .MainFormat \ [0 \] \ .Video \ .BitRateOptions =)
第一部分是(...
,不包括第一个空格。现在正则表达式不完整并抛出异常。
使用g ++,这看起来像
在抛出'std :: regex_error'实例后终止调用 what():regex_error
如果您想要完整的行,请使用std::getline
代替
while (std::getline(std::cin, needle)) {
// ...
}
我不能用最后一个重现任何中止
caps.caps \ [0]
按预期返回匹配项。