提问
我正在寻找如何使一个正则表达式大小写不敏感,与GoogleTest的正则匹配器(例如:ContainsRegex
)。
我尝试用(?i)
作为表达式的前缀,或者用/
+ /i
Package 它们,但没有成功:
EXPECT_THAT("ExpreSSion", ContainsRegex("(?i)expression"));
EXPECT_THAT("ExpreSSion", ContainsRegex("/expression/i"));
有人知道GoogleTest使用什么正则表达式引擎吗?它是否支持不区分大小写的表达式?
不愉快的解决方法
我现在的解决方法是在匹配之前降低所有字符,但这会使单元测试的可读性降低,而且这不是一个好的做法。我想测试实际生成的数据,而不是在测试之前修改它。
EXPECT_THAT(toLower("ExpreSSion"), ContainsRegex("expression"));
当然,在上面的例子中,表达式在编译时是已知的,可以显式地匹配每个字符的任何大小写,但是它变得非常不可读
EXPECT_THAT("ExpreSSion", ContainsRegex("[Ee][Xx][Pp][Rr][Ee][Ss][Ss][Ii][Oo][Nn]"));
这是可以自动化的,但是我们真的必须去那些范围来匹配一个忽略大小写的字符串吗?当然,这必须得到图书馆开箱即用的支持?
auto ContainsRegexCaseInsensitive(const std::string &expr)
{
static const auto ignoreLetterCases = [](const std::string &expr) -> std::string
{
// Replacinging letters with [<upper><lower>]
// ...
};
return ContainsRegex(ignoreLetterCases("expression"));
}
EXPECT_THAT("ExpreSSion", ContainsRegexCaseInsensitive("expression"));
2条答案
按热度按时间xxb16uws1#
根据谷歌的文档
当使用Bazel和Abseil构建时,GoogleTest使用RE2语法。
后者有一种使用 flags 指定大小写不敏感搜索的方法(参见here):
因此,
(?i)
应该工作,如果它不工作,你可以用Abseil重建GoogleTest。xjreopfe2#
默认情况下,这两个表达式都不起作用。
对于使用RE 2表达式,如“(?i)expression”你必须使用
-DGTEST_HAS_ABSL=ON
cmake选项来构建GoogleTest,否则它将使用自己的有限POSIX扩展正则表达式语法的实现,而不带标志。请参阅googletest/src/gtest-port.cc:726了解更多细节。